PHP Date / GMT Странности

Либо я схожу с ума, либо не имею ни малейшего представления о том, что делаю. Я склоняюсь к последнему.

Я пытаюсь преобразовать это: 1316826000, что, я уверен, должно быть сб, 24 сентября 2011 г., 01:00:00 по Гринвичу.

http://www.onlineconversion.com/unix_time.htm подтверждает это.

http://www.unixtimestamp.com/index.php говорит мне 23 09 / 11 @ 20:00:00 по восточному поясному времени, пока все хорошо. Я оказался в EST, это результат, который я хотел бы получить от PHP.

Когда я делаю date('l, M d, Y, h:ia', $iTime), я получаю: пятница, 23 сентября 2011 г., 00:00, полные 20 часов выходных.

Я подтвердил правильность времени сервера, используя дату ('c'). вывод даты ('c'): 2012-05-19T03:19:20+00:00. Сервер находится в центральном часовом поясе, где сейчас 22:20. 18 мая.

echo date_default_timezone_get() выводит "GMT" (устанавливается где-то еще в скрипте с помощью date_default_timezone_set('GMT'))

Что мне не хватает? Ничто из того, что я читал до сих пор, не может объяснить, как я получаю результат на 20 часов позже, чем должен быть. Если бы это был час быстро или медленно, я мог бы, по крайней мере, понять, что это какой-то идиотизм перехода на летнее время, но 20? Сумасшествие! Спасибо за чтение!


person Transistor Bass    schedule 19.05.2012    source источник
comment
Вы пробовали date_default_timezone_setпереключить свой часовой пояс на EST?   -  person deceze♦    schedule 19.05.2012
comment
1316826000 может сопоставляться с 8 вечера по восточному стандартному времени, но обратите внимание, что 23 сентября 2011 года в США все еще соблюдалось летнее время, поэтому фактический часовой пояс был бы восточноевропейского времени, в котором вместо этого было 9 вечера. FWIW, я не могу воспроизвести эту проблему в PHP 5.3.5: print(date('l, M d, Y, h:ia', 1316826000)) печатает Friday, Sep 23, 2011, 09:00pm.   -  person Mark Reed    schedule 19.05.2012


Ответы (2)


Проверьте, что говорит ваш php.ini для date.timezone. В unix это обычно здесь: /etc/php.ini Затем используйте правильный часовой пояс, распознаваемый PHP: http://www.php.net/manual/en/timezones.php

date.timezone = 'America/New_York'

Затем перезагрузите веб-сервер.

Время Unix просто означает количество секунд с начала эпохи. К часовым поясам отношения не имеет. Часовые пояса просто добавляют или вычитают 1 час (3600 секунд) из времени unix для каждой зоны, которую вы отдаляете от GMT. Пример:

$userTimezone = new DateTimeZone('America/New_York');
$gmtTimezone = new DateTimeZone('GMT');
$myDateTime = new DateTime('2014-01-22 11:44', $gmtTimezone);
$offset = $userTimezone->getOffset($myDateTime);
echo $offset;

Это выведет: -14400 или 4 часа. В чем разница между Нью-Йорком и GMT

person arikin    schedule 22.01.2014

Использование кода Java с библиотекой Joda-Time 2.3, поскольку я не знаю PHP …

long m = 1316826000L;

DateTime dateTimeUtc = new DateTime( m * 1000L, DateTimeZone.UTC );
DateTime dateTimeNewYork = dateTimeUtc.toDateTime( DateTimeZone.forID( "America/New_York" ) );

System.out.println( "dateTimeUtc: " + dateTimeUtc );
System.out.println( "dateTimeNewYork: " + dateTimeNewYork );

Я могу сказать вам, что 1316826000 секунд с начала 1970 года UTC/GMT (эпоха Unix) — это…

dateTimeUtc: 2011-09-24T01:00:00.000Z
dateTimeNewYork: 2011-09-23T21:00:00.000-04:00

Итак, как заявил комментатор, по восточному поясному времени будет 8 часов вечера, но в этот день восточноевропейское время не действовало. Летнее время (Летнее время) (идиотизм, как вы правильно заметили) было действует до 9 ноября того же года (2011). Таким образом, время суток сдвигается на один час вперед, к 9 часам вечера.

В GMT/UTC это означает 1:00 утра следующего дня.

Стандартное время на восточном побережье США отстает от UTC/GMT на 5 часов. С DST это на 4 часа меньше UTC/GMT (на один час ближе).

Где вы запутались:

  • Ваш неверный формат/преобразование времени.
    Я не могу помочь с этим, так как не знаю PHP.
  • Вы должны использовать подходящую библиотеку даты и времени для такого рода работы.
    Работа с датой и временем сложна, хитра, запутана и подвержена ошибкам.
    Этот вопрос обсуждает возможности Joda-Time (для Java ) всевозможные библиотеки для PHP.
  • Вы использовали трехбуквенный код часового пояса. Избегайте этих кодов.
    Эти коды не стандартизированы и не уникальны — часто встречаются дубликаты. Вместо этого используйте правильные названия часовых поясов. В вашем случае восточного побережья США «Америка/Нью-Йорк». Кроме того, в этом случае вы перепутали часовой пояс и правила (восточное побережье США) с конкретным применением этих правил (EST). Выражение «Америка/Нью-Йорк» означает «независимо от того, какие правила часового пояса действовали в эту дату, в то время как выражение «EST» (если оно интерпретируется как означающее Восточное стандартное время в США) означает "UTC-05:00". Поэтому либо (а) используйте название часового пояса, например "America/New_York", либо (б) используйте определенное смещение например "-05:00".
person Basil Bourque    schedule 22.01.2014