Я прочитал много вопросов StackOverflow по объекту new Date()
javascript, когда дело доходит до строк перехода на летнее время — например, когда они пересекаются. Однако я не видел ответа об этой конкретной проблеме или способе ее решения, все еще полагаясь на «время unix».
Я лично решил обойти эту проблему, передав дату javascript в качестве даты моему PHP-коду, а не время unix. И все же остается животрепещущий вопрос! Я подтвердил это поведение в IE8, Chrome и FF, поэтому я предполагаю, что оно будет вести себя так же для вас. (Обновление: пользователи OS X могут не генерировать такое поведение)
Мое исследование; самые близкие вопросы к моему вопросу:
- Этот пользователь работал в определенные часы сразу после перехода на летнее время.
- Этот пользователь беспокоился о представлении времени в зависимости от пользовательского часовой пояс. В принятом ответе на этой странице упоминалось, что
getTimezoneOffset
ненадежный, что заставило меня не вникать в это. - Смотрите мой ответ ниже на другие вопросы, которые имеют некоторые важные идеи
Я создал тестовый сценарий примерно 1 ноября 2006 года. Это может сработать или не сработать для вас в зависимости от часового пояса, в котором вы находитесь. Если я правильно понимаю аспект javascript, вам нужно будет синхронизировать часы вашего ПК с
Восточное время (США и Канада) и установите флажок «Автоматическая настройка часов на летнее время».
Я основываю этот эксперимент на часовом поясе Индианаполиса в PHP. Мой результат javascript, когда я обнаружил, что время unix на 1 ноября 2006 г. отстает на один час от того, что генерирует PHP (3600 секунд). Согласно этой странице (спасибо, Джон!) javascript неверен.
Результаты на двух языках были согласованы 06.11.2006!
Это и другие исследования заставляют меня поверить, что Javascript неправильно понял свою историю и выбрал неправильное воскресенье, чтобы «отступить» от перехода на летнее время, тем самым вызвав несоответствие, которое я вижу.
Я попытался максимально упростить это, но в движении все еще довольно много шестеренок.
Вот PHP-код и выходные данные, которые показывают ПРАВИЛЬНОЕ количество миллисекунд до даты 01.11.2006.
date_default_timezone_set (Америка/Индиана/Индианаполис); echo Unixtime на 1 ноября 2006 г.: .strtotime(11/01/2006).\n; echo Unixtime на 6 ноября 2006 г.: .strtotime(11/06/2006);
Результат:
Unixtime for November 1, 2006 is: 1162357200 (where the disagreement lies)
Unixtime for November 6, 2006 is: 1162789200
Оба они основаны на GMT-0500.
В Javascript (см. мой jsfiddle**) я вызываю
new Date
, а затемgetTime()
вот так (и удалить миллисекунды):новая дата (01.11.2006).getTime()/1000 новая дата (06.11.2006).getTime()/1000
Это генерирует значения
1162353600 <-- PHP outputs: 1162357200
1162789200 <-- the same as PHP for '2006/11/06'; congruence is restored
что составляет разницу (для 01.11.2006) от вывода через PHP в 3600 секунд или один час. Это значение (на час раньше) при обработке в моем PHP-приложении сгенерировало предыдущий день (2006/10/31), что было неприемлемо, поскольку оно сломало мою навигацию вперед. (см. дополнительные пояснения по моему конкретному сценарию)
Вывод в Javascript: Date("2006/11/01")
без вызова getTime()
проясняет часть загадки, потому что javascript показывает смещение, которое использовалось при использовании GMT-0400
.
Мой эксперимент jsfiddle** (также указанный выше) показывает эти результаты.
** (вам может потребоваться изменить часовой пояс вашего компьютера, чтобы увидеть идентичное поведение).
Возможно, в игру вступает то, что согласно Википедии 2006 год был первым годом, когда Индиана начала использовать летнее время Любопытная головоломка в любом случае.
Поскольку я уже разработал свое решение (не полагаясь на время unix в моем javascript), я подумал, что должен опубликовать это для потомков, и, надеюсь, кто-то может знать, как исправить значение, которое показывает javascript.
Вопрос в следующем: как привести в соответствие два результата "время unix" между PHP и javascript? Я был бы признателен, если бы узнал, как обойти «линию» DST или вообще. (В настоящее время я предполагаю, что проблема связана с линией DST).
Обновление: iMac с Chrome сгенерировал результаты, которые генерирует PHP. Что??? Дикий. Любое исправление этого поведения на стороне javascript выглядит как отличное мероприятие (или, по крайней мере, уродливое). Возможно, это не проблема с javascript, поскольку он генерирует правильный ответ в зависимости от ОС (или других факторов?).
Примечательно, что на этом iMac я не устанавливал часовой пояс принудительно, и я не уверен, что этот компьютер Apple позволит это сделать. Настройки Автоматически устанавливать дату и время были проверены (true
) и disabled
. Часовой пояс был установлен на восточное летнее время. Флажок "Установить часовой пояс автоматически" был снят (false
) и disabled
.
Я добавил тег Windows
, чтобы подчеркнуть, что это не проблема в OSX.
Обновление: согласно сайту ссылка указана выше, я убедился, что все следующие даты пересекаются с новым смещением по Гринвичу в соответствующие даты (обновленная скрипка) -- в отличие от ответа 2006 года с отставанием на одну неделю. То есть 4 ноября 2007 года было GMT-4
, а 5 ноября 2007 года вернулось GMT-5
.
- 2007 Воскресенье, 11 марта, 2:00 Воскресенье, 4 ноября, 2:00
- 2008 Воскресенье, 9 марта, 2:00 Воскресенье, 2 ноября, 2:00
- 2009 Воскресенье, 8 марта, 2:00 Воскресенье, 1 ноября, 2:00
- 2010 Воскресенье, 14 марта, 2:00 Воскресенье, 7 ноября, 2:00
- 2011 Воскресенье, 13 марта, 2:00 Воскресенье, 6 ноября, 2:00
Наконец, если вы знаете надлежащие каналы для отправки этой ошибки в 2006 году в любой источник часового пояса, на который опирается Javascript, сделайте это и дайте мне знать об этом.