PHP функция часового пояса не работает - PullRequest
2 голосов
/ 25 августа 2011

Я создаю форум, который также хранит время отправки сообщения, и мне нужно преобразовать его в часовой пояс пользователя.Теперь база данных MySQL хранит время с UTC_TIMESTAMP() (в столбце с типом DATETIME), и я создал небольшую функцию из кода на http://www.ultramegatech.com/blog/2009/04/working-with-time-zones-in-php/ для преобразования времени в часовой пояс пользователя.Это функция:

function convertTZ($timestamp, $tz='UTC', $format='d-m-Y H:i:s') {
    // timestamp to convert
    $timestamp = strtotime($timestamp);
    // the time formatting to use
    $format = $format;
    // the time zone provided
    $tz = $tz;

    // create the DateTimeZone object for later
    $dtzone = new DateTimeZone($tz);

    // first convert the timestamp into an RFC 2822 formatted date
    $time = date('r', $timestamp);

    // now create the DateTime object for this time
    $dtime = new DateTime($time);

    // convert this to the user's timezone using the DateTimeZone object
    $dtime->setTimeZone($dtzone);

    // print the time using your preferred format
    $time = $dtime->format($format);

    return $time;
}

И я сделал тестовую страницу в http://assets.momo40k.ch/timezones.php.
Теперь, когда я вставляю сообщение в базу данных, скажем, 11:50 в моем часовом поясе (то есть Europe/Rome), оно вставляет в UTC 09:50, что является правильным, согласно некоторым онлайн-конвертерам часовых поясов.Но когда я пытаюсь преобразовать его обратно в Europe/Rome с помощью функции convertTZ(), он возвращает 09:50, как если бы Europe/Rome было UTC.Если я попытаюсь преобразовать его в часовой пояс GMT + 2: 00, он вернет 10:50.Может кто-нибудь угадай, почему это так?PS: я не использую функцию CONVERT_TZ() SQL, потому что мой сервер не поддерживает именованные часовые пояса, поэтому эта функция - мой обходной путь.

Ответы [ 2 ]

1 голос
/ 25 августа 2011

MySQL всегда хранит поля TIMESTAMP во внутреннем UTC (на самом деле это определение метки времени Unix). Поэтому, когда вы выбираете или ОБНОВЛЯЕТЕ / ВСТАВЛЯЕТЕ / ЗАМЕНИТЕ, время, которое вы получаете или устанавливаете, всегда находится в локальном часовом поясе сервера MySQL.

Таким образом, обычной ошибкой является сохранение UTC_TIMESTAMP (), который MySQL интерпретирует как местное время, и поэтому текущее время дважды преобразуется в UTC, когда оно внутренне сохраняется в поле как UNIX TIMESTAMP.

1 голос
/ 25 августа 2011

Убедитесь, что ваши сохраненные метки времени указаны в формате UTC:

$date = new DateTime($timestamp, new DateTimeZone("UTC"));
$date->format(DATE_W3C); // does it gives the expected result ?

Кстати, ваша функция может быть упрощена до этого:

function convertTZ($timestamp, $tz='UTC', $format='d-m-Y H:i:s') {
    $dtime = new DateTime($timestamp, new DateTimeZone("UTC"))
    $dtime->setTimezone(new DateTimeZone("UTC"));
    return $dtime->format($format);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...