Настройка часового пояса в PHP с помощью DateTime / DateTimeZone - PullRequest
5 голосов
/ 18 сентября 2009

Существует много информации о настройке часового пояса в PHP, но я не нашел ответа именно на то, что я хочу сделать из-за шума.

Учитывая время в одном часовом поясе, я хочу преобразовать его во время в другом часовом поясе.

Это по сути то, что я хочу сделать, но я должен быть в состоянии сделать это, используя только встроенные PHP-библиотеки, а не PEAR Date.

Это то, что я делал, но, кажется, всегда дает мне смещение относительно GMT:

$los_angeles_time_zone = new DateTimeZone('America/Los_Angeles');
$hawaii_time_zone = new DateTimeZone('Pacific/Honolulu');

$date_time_los_angeles = new DateTime('2009-09-18 05:00:00', $los_angeles_time_zone);
printf("LA Time: %s<br/>", $date_time_los_angeles->format(DATE_ATOM));

$time_offset = $hawaii_time_zone->getOffset($date_time_los_angeles);
printf("Offset: %s<br/>", $time_offset);

Это вывод:

LA Время: 2009-09-18T05: 00: 00-07: 00
Смещение: -36000

Я ожидал 3 часа (10800 секунд). но вещь «-7: 00» говорит мне, что она сохраняет все относительно GMT, что, возможно, объясняет, почему это дает мне «абсолютное» смещение.

Как мне просто получить смещение между двумя часовыми поясами без всего этого времени, хохаха?

Спасибо.

UPDATE:

Я подумал, что могу сделать это и получить то, что хочу:

    $date_time_los_angeles = new DateTime('2009-09-18 05:00:00', $los_angeles_time_zone);
printf("LA Time: %s<br/>", $date_time_los_angeles->format(DATE_ATOM));

$date_time_hawaii = new DateTime('2009-09-18 05:00:00', $hawaii_time_zone);
printf("Hawaii Time: %s<br/>", $date_time_hawaii->format(DATE_ATOM));


$time_offset = $los_angeles_time_zone->getOffset($date_time_los_angeles) - $hawaii_time_zone->getOffset($date_time_los_angeles);
printf("Offset: %s<br/>", $time_offset);

Но мне неловко. Кто-нибудь знает более чистый способ сделать это?

Ответы [ 3 ]

8 голосов
/ 18 сентября 2009

Вот пара функций, использующих классы DateTime. Первый вернет разницу в секундах между двумя часовыми поясами. Вторая возвращает «перевод» времени из одного часового пояса в другой.

function timezone_diff($tz_from, $tz_to, $time_str = 'now')
{
    $dt = new DateTime($time_str, new DateTimeZone($tz_from));
    $offset_from = $dt->getOffset();
    $timestamp = $dt->getTimestamp();
    $offset_to = $dt->setTimezone(new DateTimezone($tz_to))->setTimestamp($timestamp)->getOffset();
    return $offset_to - $offset_from;
}

function time_translate($tz_from, $tz_to, $time_str = 'now', $format = 'Y-m-d H:i:s')
{
    $dt = new DateTime($time_str, new DateTimezone($tz_from));
    $timestamp = $dt->getTimestamp();
    return $dt->setTimezone(new DateTimezone($tz_to))->setTimestamp($timestamp)->format($format);
}

Демо-версия:

$los_angeles_time = '2009-09-18 05:00:00';
$los_angeles_tz   = 'America/Los_Angeles';
$hawaii_tz        = 'Pacific/Honolulu';

$los_angeles_hawaii_diff = timezone_diff($los_angeles_tz, $hawaii_tz, $los_angeles_time);
echo $los_angeles_hawaii_diff . '<br />';

$hawaii_time = time_translate($los_angeles_tz, $hawaii_tz, $los_angeles_time);
echo $hawaii_time . '<br />';
1 голос
/ 16 марта 2010

Как прокомментировал GZipp, его код действительно только для PHP> = 5.3.0. Это хорошо, но - вот версия, которая будет работать на PHP> = 5.2.0. (Между прочим, это также работает в 5.3+ и с 2 меньшими вызовами функций)

<?php
function time_translate($tz_from, $tz_to, $time_str = 'now', $format = 'Y-m-d H:i:s')
{
    $dt = new DateTime($time_str, new DateTimezone($tz_from));
    $dt->setTimezone(new DateTimezone($tz_to));
    return $dt->format($format);
}

$time_diffs = array('now', '-1 hour', '-1 day', '-1 week', '-1 month', '+1 hour', '+1 week', '+1 month');

foreach ($time_diffs as $diff)
{
 echo "{$diff}:"
  . "\n\t"
  . "Current: " . date("Y-m-d H:i:s", strtotime($diff))
  . "\n\t"
  . "UTC: " . time_translate("US/Eastern", "UTC", $diff)
  . "\n\n";
}
0 голосов
/ 18 сентября 2009

Просто минус первый раз со второго.

что вы сможете получить разницу во времени в секундах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...