Корректировка часового пояса в PHP с DateTime / DateTimeZone

Мне нравится позволять почти всему моему пузырю исключений до обработчика приложений, где они зарегистрированы, и универсальное сообщение об ошибке отображено конечному пользователю. Но протест здесь состоит в том, что не должно быть очень многих исключений, которые на самом деле происходят. Если Ваше приложение выдает много исключений, то существуют, вероятно, что-то не так или что-то, что, возможно, было кодировано лучше. По большей части я пытаюсь удостовериться, что мой код проверяет на исключительные случаи в усовершенствованном, потому что генерация исключений является дорогой.

Как в стороне, производя кодирование на стороне обычно плохая идея. На основе моего опыта обычно они - консультанты, которые находятся только в нем для зарплаты и не имеют никакой доли в успехе проекта. Кроме того, Вы сдаетесь их - отсутствию - кодирование стандартов (если Вы не включали это в контракт).

5
задан Community 23 May 2017 в 11:51
поделиться

3 ответа

Вот пара функций, использующих классы 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 />';
8
ответ дан 14 December 2019 в 01:12
поделиться

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

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

0
ответ дан 14 December 2019 в 01:12
поделиться

Как прокомментировал 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";
}
1
ответ дан 14 December 2019 в 01:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: