0Pricing
PHP Academy · Урок

Часовые пояса в PHP

Работайте с несколькими часовыми поясами с помощью DateTimeZone и date_default_timezone_set

«Часовые пояса в PHP» — бесплатный урок PHP Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения PHP Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс PHP Academy содержит 4 уроков всего.

Почему часовые пояса важны

Если ваше приложение обслуживает пользователей по всему миру, обработка часовых поясов имеет решающее значение. PHP использует функции и классы с поддержкой часовых поясов, чтобы корректно выполнять преобразования.

  • Всегда храните время в UTC в базе данных
  • Преобразуйте его в местный часовой пояс пользователя только при отображении

date_default_timezone_set()

Установите часовой пояс по умолчанию для всех функций работы с датами:

<?php
// Set at the top of your script or in php.ini
date_default_timezone_set('Europe/Istanbul');

echo date('Y-m-d H:i:s');  // local Istanbul time
echo PHP_EOL;

date_default_timezone_set('UTC');
echo date('Y-m-d H:i:s');  // UTC time

// Or set in php.ini:
// date.timezone = "Europe/London"

Класс DateTimeZone

Создайте объекты часовых поясов для использования с DateTime:

<?php
$utc      = new DateTimeZone('UTC');
$istanbul = new DateTimeZone('Europe/Istanbul');
$ny       = new DateTimeZone('America/New_York');

$dt = new DateTime('now', $utc);
echo $dt->format('Y-m-d H:i:s T');  // UTC time

Преобразование между часовыми поясами

Преобразуйте DateTime в другой часовой пояс с помощью setTimezone():

<?php
$utcTime = new DateTime('2024-05-27 12:00:00', new DateTimeZone('UTC'));

$istanbul = clone $utcTime;
$istanbul->setTimezone(new DateTimeZone('Europe/Istanbul'));

$newYork = clone $utcTime;
$newYork->setTimezone(new DateTimeZone('America/New_York'));

echo 'UTC:      ' . $utcTime->format('H:i T')  . PHP_EOL;
echo 'Istanbul: ' . $istanbul->format('H:i T') . PHP_EOL;
echo 'New York: ' . $newYork->format('H:i T')  . PHP_EOL;

getOffset() и DST

Получите смещение относительно UTC в секундах и проверьте DST:

<?php
$tz = new DateTimeZone('America/New_York');
$dt = new DateTime('now', $tz);

$offset = $tz->getOffset($dt);        // offset in seconds
$offsetHours = $offset / 3600;
echo 'Offset: ' . $offsetHours . 'h'; // e.g. -5 or -4 in DST

$transitions = $tz->getTransitions(
    strtotime('2024-01-01'),
    strtotime('2024-12-31')
);
echo 'DST changes in 2024: ' . count($transitions);

Хранение в UTC и отображение по местному времени

Рекомендуемый подход: храните время в UTC в базе данных, а пользователю показывайте местное время:

<?php
// Store: always save as UTC
$createdAt = (new DateTimeImmutable('now', new DateTimeZone('UTC')))
    ->format('Y-m-d H:i:s');

// Display: convert to user's timezone
$userTz  = new DateTimeZone($user['timezone'] ?? 'UTC');
$display = (new DateTime($createdAt, new DateTimeZone('UTC')))
    ->setTimezone($userTz)
    ->format('d M Y, H:i T');

Определение часового пояса пользователя

Определите и сохраните часовой пояс пользователя для отображения данных:

// JavaScript: detect and send to PHP:
// const tz = Intl.DateTimeFormat().resolvedOptions().timeZone;
// fetch('/api/set-timezone', { method:'POST', body: tz });

<?php
// PHP: validate and store
$tz = $_POST['timezone'] ?? 'UTC';
$valid = in_array($tz, DateTimeZone::listIdentifiers());

if ($valid) {
    $_SESSION['timezone'] = $tz;
    setcookie('user_tz', $tz, time() + 365 * 86400);
}

DateTimeZone::listIdentifiers()

Получите все допустимые идентификаторы часовых поясов:

<?php
// All identifiers
$all = DateTimeZone::listIdentifiers();
echo count($all) . ' timezones available';

// Filter by region
$europe = DateTimeZone::listIdentifiers(DateTimeZone::EUROPE);
echo count($europe) . ' European timezones';

// Check if a timezone string is valid
function isValidTimezone(string $tz): bool {
    return in_array($tz, DateTimeZone::listIdentifiers());
}
var_dump(isValidTimezone('Europe/Istanbul')); // true

Форматирование смещения часового пояса

Отформатируйте смещение часового пояса для отображения и использования программными интерфейсами:

<?php
$dt = new DateTime('now', new DateTimeZone('America/Los_Angeles'));

echo $dt->format('P');     // +05:30 or -07:00
echo $dt->format('O');     // +0530 (no colon)
echo $dt->format('T');     // PST or PDT
echo $dt->format('e');     // America/Los_Angeles
echo $dt->format('Z');     // offset in seconds

Метки времени Unix не зависят от часового пояса

Метки времени Unix обозначают конкретный момент времени независимо от часового пояса — используйте их для сравнений и расчётов:

<?php
// These represent the same moment:
$utc   = new DateTime('2024-05-27 12:00:00', new DateTimeZone('UTC'));
$ist   = new DateTime('2024-05-27 15:00:00', new DateTimeZone('Asia/Kolkata'));

echo $utc->getTimestamp();   // same timestamp
echo $ist->getTimestamp();   // same timestamp

var_dump($utc->getTimestamp() === $ist->getTimestamp()); // true

date_create с часовым поясом

Процедурная работа с часовыми поясами с помощью date_create и date_timezone_set:

<?php
$dt = date_create('now', timezone_open('UTC'));
$tz = timezone_open('Europe/Istanbul');

date_timezone_set($dt, $tz);
echo date_format($dt, 'Y-m-d H:i:s T');

// Check transition info
$info = timezone_transitions_get($tz);
echo 'Current offset: ' . ($info[0]['offset'] / 3600) . 'h';

Быстрая проверка

Где следует хранить даты и время в базе данных глобально распределённого приложения?

Итоги: часовые пояса PHP

Главное о часовых поясах:

  • Устанавливайте часовой пояс по умолчанию с помощью date_default_timezone_set()
  • Используйте объекты DateTimeZone вместе с DateTime
  • Применяйте setTimezone() для преобразования между часовыми поясами
  • Всегда храните время в UTC в базе данных
  • Проверяйте часовые пояса пользователей с помощью DateTimeZone::listIdentifiers()
  • Метки времени Unix обозначают моменты времени, не зависящие от часового пояса

Часто задаваемые вопросы

Урок «Часовые пояса в PHP» бесплатный?

Да — полный текст урока «Часовые пояса в PHP» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс PHP Academy, подпишись на CoddyKit PRO. Курс PHP Academy содержит 4 уроков всего.

Чему я научусь в уроке «Часовые пояса в PHP»?

Работайте с несколькими часовыми поясами с помощью DateTimeZone и date_default_timezone_set Ты практикуешь PHP Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать PHP Academy?

Предыдущий опыт не требуется. PHP Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Часовые пояса в PHP»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке PHP Academy?

Да. Каждый урок PHP Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Временные метки Unix и date()
  2. Класс DateTime
  3. Арифметика дат с DateInterval
  4. Часовые пояса в PHP
← Назад к PHP Academy