PHP date_default_timezone_set () Восточное стандартное время (EST) - PullRequest
12 голосов
/ 06 апреля 2011

Короче говоря

Существует ли официальный, не осуждаемый часовой пояс, который PHP5 распознает по восточному стандартному времени, а не по восточному времени DAYLIGHT?

Короткая история: -P

Ничего себе, я не могу поверить, что PHP делает такой кластерный поток из установки времени.

Я хотел бы использовать PHP5 date_default_timezone_set (), чтобы установить часовой пояс для моего скрипта. Я хочу использовать стандартное время. Я не хочу, чтобы мой сценарий соблюдал переход на летнее время. Я не хочу использовать gmtime () и вычитать 60 * 60 * 5 секунд каждый раз, когда моя программа записывает время. Я тоже не хочу сохранять это значение в переменной. Установка часового пояса по умолчанию более элегантна и делает скрипт более переносимым на другие серверы и локали.

К сожалению, PHP требует, чтобы я использовал одну из их глупых "официальных часовых поясов" при установке часового пояса по умолчанию. Существует "America / New_York", но я понятия не имею, соблюдает ли он или какие-либо из официальных часовых поясов PHP переход на летнее время. Экспериментально я обнаружил, что «Америка / Нью-Йорк» действительно наблюдает летнее время. «Америка / Панама» - это EST и, следовательно, не соблюдает DST ... но что, если Панама когда-нибудь передумает о DST в будущем? (Они наблюдали ТЛЧ в 1908 г.)

Потому что Панама всегда могла передумать; Я просто хочу использовать смещение по Гринвичу или UTC.

Тогда есть это ...

http://us.php.net/manual/en/timezones.others.php

Приведенный выше список ссылок, что я предполагаю, является устаревшими часовыми поясами. "EST" там, но очень ориентирован на США, поэтому я понимаю, почему он не рекомендуется. «Ect / GMT-5» тоже есть, и я абсолютно не знаю, почему это не рекомендуется. Если вы спросите меня, все часовые пояса названий мест должны быть признаны устаревшими, а часовые пояса GMT не должны быть устаревшими ... но получите это ... "Ect / GMT-5" на самом деле неправильно! Мне пришлось использовать «Ect / GMT + 5», чтобы получить восточное стандартное время США. Я почти уверен, что не на 5 часов впереди Англии здесь, на восточном побережье.

Ответил

Никто действительно не ответил на вопрос. Думаю, я сам на это отвечу. «Нет, нет неделимого часового пояса, который PHP5 распознает по восточному стандартному времени»

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

Я неохотно отдаю должное чуваку, который показывает вам, как правильно хранить и извлекать время, чтобы будущие люди, ищущие это, узнали, как сделать это правильно.

Ответы [ 5 ]

19 голосов
/ 06 апреля 2011

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

Вся причина названных часовых поясов состоит в том, чтобы точно представлять местное время . Представление «стандартного» времени как местного времени , когда этот локальный район находится внутри летнего времени, объективно неверно. Любой в этом часовом поясе, который читает время, будет дезинформирован.

Если вам нужно хранить и работать с датами и временем, которые игнорируют часовые пояса, тогда используйте для этого UTC, то есть хранение и обычную математику. Стоит помнить, что даже старая добрая метка времени Unix - это «секунды после полуночи, 1 января 1970 года, UTC ».

Если вам нужно представить время, локальное для пользователя, вам следует разрешить ему выбрать местный часовой пояс и преобразовать его на дисплее . Современные PHP DateTime и DateTimeZone делают это очень простым . Из интерактивной подсказки:

php > $utc = new DateTimeZone('UTC');
php > $amla = new DateTimeZone('America/Los_Angeles');
php >
php > $two_past_midnight = new DateTime('2011-04-05 00:02', $utc);
php > $two_past_midnight->setTimeZone($amla);
php > echo $two_past_midnight->format('Y-m-d H:i:s');
2011-04-04 17:02:00

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


В качестве альтернативы, если вы действительно, действительно, действительно хотите сгладить часовые пояса DST, посмотрите комбинации getTransitions и getOffset с различными часовыми поясами date() форматов , I в частности. Вы можете ткнуть и подтолкнуть полученную информацию, чтобы найти, когда «стандартная» версия любой зоны DST перейдет в следующую, и скорректировать ее соответствующим образом. Помните, что разные области переходят в разное время, и не все области переходят на одну и ту же величину ... а некоторые не переходят вообще. Я думаю, что кто-то уже упоминал Индиану .

Обычно я также привожу здесь пример кода, но математика даты наполняет меня ненасытной жаждой насилия. Кто бы ни решил, что 60, 60, 24, 7, 4-6, 12 и 52 были приемлемыми способами думать о временах и датах, они были злыми, злыми людьми. К счастью, все они были мертвы в течение сотен и тысяч лет.

1 голос
/ 21 июня 2012
echo ' Format ' . date('m/d/Y H:i:s a') ;
<br/>//maketime function- mktime(hour,minute,second,month,day,year,is_dst)
<br/>$EasternTimeStamp =mktime(date('H')-6,date('i'),date('s'),date("m"),date("d"),date("Y"));
<br/>// date function- date(format, timestamp)
<br/>echo 'Format ' . date('m/d/Y H:i:s a',$EasternTimeStamp) ;
1 голос
/ 06 апреля 2011

America/New_York соблюдает летнее время и является рекомендуемым часовым поясом. (Я ездил на конференцию в прошлом году, где Дерик Ретанс , который написал много кода даты / времени, говорил.) Идея региональных часовых поясов состоит в том, что они подчиняются правилам часовых поясов для города / региона. они обозначают (вот почему существует около 7 часовых поясов Индианы).

0 голосов
/ 06 апреля 2011

Ну, если вы действительно хотите X часов до или после даты UTC, я бы сделал это:

$now = gmdate('Y-m-d H:i:s', time() - 3600 * $hours);

В вашем случае, $hours будет 5, я думаю.

Как и другие предполагали, включая меня, это нехорошая практика ... Но вы знаете об этом.

0 голосов
/ 06 апреля 2011

Вы всегда должны хранить время, используя UTC, которое возвращает time(), затем установите часовой пояс на основе местоположения сервера, который будет обновляться для летнего времени, если применимо.

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