2010-11-05 3 views
12

В предыдущем вопросе я написал о функции даты javascript, которая была таинственно остановлена ​​11/07/101. Благодаря пользователям stackoverflow мне сказали, что проблема заключается в летнем времени. Javascript date, is this my error or did I find a bug?Javascript date: какой лучший способ справиться с летним временем?

Итак, мой последний вопрос на этом - это рекомендуемый подход в Javascript для работы с летним временем сбережения?

Есть http://code.google.com/p/datejs/ лучший подход для решения этой проблемы?

ответ

19

Лучший способ - не иметь дело с DST. Используйте методы UTC, и вам не придется беспокоиться о пересечении границы DST или о любом другом разрыве в часовом поясе (правила часовых поясов локали могут меняться по многим причинам, а не только DST).

var timestamp= Date.UTC(2010, 10-1, 31, 0, 0, 0); // zero-based month: 9->october 
var nextday= new Date(timestamp+86400000); // add one day 
var ymd= [ 
    nextday.getUTCFullYear(), 
    nextday.getUTCMonth()+1, // zero-based month 
    nextday.getUTCDate() 
].join('-'); 
alert(ymd); // 2010-11-1 

Если выше было сделано с new Date(2010, ...) и getDate() и т.д., было бы вернуть 2010-10-31, день добавить неудачу из-за изменения летнего времени (в моем регионе, в любом случае).

Жаль, что наиболее очевидные методы по умолчанию в Date связаны с местным временем, тем более что JavaScript предоставляет очень мало контекста для сценариев, на самом деле «локальное время». UTC - более стабильное предложение.

+1

Согласитесь, я работал над временем и посещаемостью, поэтому это была очень распространенная проблема. Наш подход - всегда работать с методами UTC. Чтобы отобразить правильное время (и получать данные от сотрудника), нам нужно было знать смещение временной зоны для каждого сотрудника (который может быть в нескольких часовых поясах) и список дней, в которые DST был активен для этого смещения часового пояса –

1

Использование Date.setHours(hour,min,sec,millisec) установить час по умолчанию в полдень: Date.setHours(11); (view reference)

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

Смежные вопросы