Как получить независимую временную метку DST в php

Я хочу оставить выбор, следовать ли летнему времени или нет, на усмотрение пользователя. Я пробовал часовые пояса CST и CST6CDT, но оба дали тот же результат.

php > $tz = new DateTimeZone('CST');
php > 
php > $d = new DateTime('now', $tz);
php > print_r($d);
DateTime Object
(
    [date] => 2013-10-16 08:34:53
    [timezone_type] => 3
    [timezone] => America/Chicago
)
php > 
php > $tz = new DateTimeZone('CST6CDT');
php > 
php > $d = new DateTime('now', $tz);
php > print_r($d);
DateTime Object
(
    [date] => 2013-10-16 08:35:21
    [timezone_type] => 3
    [timezone] => CST6CDT
)
php > 

Есть ли способ получить метку времени без летнего времени? Я здесь что-то не так делаю?


person Runish Kumar    schedule 16.10.2013    source источник
comment
Просто вопрос, чтобы удовлетворить мое любопытство: зачем вам это нужно?   -  person Evert    schedule 16.10.2013
comment
Что ж, это требования к проекту, которые я получил.   -  person Runish Kumar    schedule 16.10.2013


Ответы (2)


CST прямо сейчас ЕСТЬ на летнее время (кроме меня, находящегося в Саскачеване, где мы не соблюдаем летнее время). Так что CST и CDT технически сейчас в одно и то же время. Если бы вы попробовали это снова в середине ноября после переключения на летнее время, у вас было бы другое время.

Попробуйте вместо этого GMT-6, который даст вам время типа cst, независимо от DST, потому что зоны GMT не зависят от DST.

person Marc B    schedule 16.10.2013
comment
да, понял. Это один из вариантов, но я подумал, что есть более разумный способ сделать это. - person Runish Kumar; 16.10.2013
comment
сохраните все ваши даты как UTC, а затем конвертируйте в любой часовой пояс, который пользователь выбрал в своих предпочтениях. если вы принимаете ввод от пользователя, тогда предположите, что он находится в ИХ часовом поясе, и преобразуйте его в UTC перед его сохранением. - person Marc B; 16.10.2013
comment
Не могу этого сделать, потому что приложение уже запущено, и у нас есть огромный объем данных в базе данных. Итак, изменение текущей логики сделает все существующие данные неверными. - person Runish Kumar; 16.10.2013
comment
@MarcB - Вы должны сказать, что Центральное время сейчас на летнем времени. Центральное стандартное время явно означает нет летнего времени. Например, в Аризоне постоянно используется горное стандартное время MST (UTC-07: 00), в то время как остальная часть горного времени в настоящее время соответствует горному летнему времени (UTC-06: 00). Неуместно говорить, что MST == MDT. - person Matt Johnson-Pint; 16.10.2013

PHP использует стандартную базу данных часовых поясов IANA. В этих данных такие значения, как "CST" и "CST6CDT", существуют только для обратной совместимости с часовыми поясами POSIX. Вы не должны использовать их без крайней необходимости.

В документации по PHP это очень четко сказано:

Предупреждение

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

Вместо этого вы должны использовать "America/Chicago" для обозначения Центрального часового пояса США.

Вы можете узнать больше о базе данных часовых поясов IANA в вики-странице тегов часовых поясов.

Отчасти причина того, что CST - плохой выбор для идентификатора часового пояса, заключается в том, что сокращения часовых поясов могут быть неоднозначными. «CST» может означать «центральное стандартное время», но это может быть центральное время США или центральное время Австралии. Это также может означать «Стандартное время Кубы» или «Стандартное время Китая».

Даже если вы знаете, что он находится в США, «CST6CDT» не очень хороший идентификатор, потому что он не учитывает, что правила DST для США изменились в 2007 году.

Относительно вашего комментария:

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

Это запах кода. Каждый раз, когда вы видите на веб-сайте флажок для перехода на летнее время [да / нет], это явный признак того, что приложение неправильно использует часовые пояса. Когда ваш пользователь выбирает часовой пояс «Америка / Чикаго» или «Америка / Лос-Анджелес», или «Европа / Лондон» и т. Д. Информация в базе данных часовых поясов уже знает, следует ли следовать летнему времени и когда. DST запускается и останавливается в разное время по всему миру, поэтому важно, чтобы вы позволяли правильно использовать базу данных.

person Matt Johnson-Pint    schedule 16.10.2013