Подтвердить что ты не робот

PHP date_default_timezone_set() Восточное стандартное время (EST)

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

Есть ли официальная неопределенная часовая зона, которую PHP5 распознает для восточного СТАНДАРТНОГО времени - не восточное время DAYLIGHT?

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

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

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

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

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

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

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

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

Ответил?

Никто не ответил на этот вопрос. Поэтому я думаю, что сам ответю. "Нет, нет, не устаревший часовой пояс, который PHP5 распознает для восточного СТАНДАРТНОГО времени"

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

Ответ 5

Хорошо, если вы действительно хотите X часов до или после даты UTC, я бы сделал следующее:

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

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

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