Intereting Posts

Настройка часового пояса в PHP с помощью DateTime / DateTimeZone

Есть много информации о настройке часовых поясов в 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, что, возможно, объясняет, почему он дает мне «абсолютное» смещение.

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

Благодарю.

ОБНОВИТЬ:

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

  $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); 

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

Solutions Collecting From Web of "Настройка часового пояса в PHP с помощью DateTime / DateTimeZone"

Вот несколько функций, использующих классы 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 = 'Ymd 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 />'; 

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

 <?php function time_translate($tz_from, $tz_to, $time_str = 'now', $format = 'Ymd 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("Ymd H:i:s", strtotime($diff)) . "\n\t" . "UTC: " . time_translate("US/Eastern", "UTC", $diff) . "\n\n"; } 

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

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