PHP date_default_timezone_set() Восточное стандартное время (EST)
Короче
Существует ли официальный, не осуждаемый часовой пояс, который PHP5 распознает по восточному стандартному времени, а не по восточному времени DAYLIGHT?
Короткая история долго:-P
Ничего себе, я не могу поверить, что PHP делает такой кластерный поток из установки времени.
Я хотел бы использовать PHP5 date_default_timezone_set(), чтобы установить часовой пояс для моего скрипта. Я хочу использовать стандартное время. Я не хочу, чтобы мой сценарий соблюдал переход на летнее время. Я не хочу использовать gmtime() и вычитать 60*60*5 секунд каждый раз, когда моя программа записывает время. Я тоже не хочу сохранять это значение в переменной. Установка часового пояса по умолчанию более элегантна и делает скрипт более переносимым на другие серверы и локали.
К сожалению, PHP требует, чтобы я использовал один из их глупых "официальных часовых поясов" при установке часового пояса по умолчанию. Существует "America/New_York", но я понятия не имею, соблюдает ли он или какие-либо из официальных часовых поясов PHP переход на летнее время. Экспериментально я обнаружил, что "America/New_York" действительно наблюдает летнее время. "Америка / Панама" - это 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 ответов
То, что вы хотите сделать, непрактично и приведет к тому, что ваши пользователи будут вас ненавидеть.
Вся причина названных часовых поясов состоит в том, чтобы точно представлять местное время. Представлять "стандартное" время как местное время, когда этот локальный район находится внутри летнего времени, объективно неверно. Любой в этом часовом поясе, который читает время, будет дезинформирован.
Если вам нужно хранить и работать с датами и временем, в которых игнорируются часовые пояса, используйте для этого 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 были приемлемыми способами думать о временах и датах, они были злыми, злыми людьми. К счастью, они все были мертвы в течение сотен и тысяч лет.
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) ;
America/New_York
соблюдает летнее время и является рекомендуемым часовым поясом. (Я ездил на конференцию в прошлом году, где выступал Дерик Ретанс, который написал много кода даты / времени.) Идея региональных часовых поясов состоит в том, что они подчиняются правилам часовых поясов для города / региона, который они обозначают (вот почему Есть как 7 часовых поясов Индианы).
Ну, если вы действительно хотите X часов до или после даты UTC, я бы сделал это:
$now = gmdate('Y-m-d H:i:s', time() - 3600 * $hours);
В твоем случае, $hours
было бы 5, я думаю.
Как и предполагали другие, в том числе и я, это не очень хорошая практика... Но вы знаете об этом.
Вы всегда должны хранить время, используя UTC, вот что time()
возвращается, затем установите часовой пояс на основе местоположения сервера, который будет обновлен для летнего времени, если это применимо.