Необходимо отображать местное время по переходам DST, используя Javascript Date Object - PullRequest
6 голосов
/ 05 сентября 2011

Я пытаюсь вывести серию раз в часах (в часах) внутри Javascript (например, внутри веб-браузера, такого как Firefox). Эта серия времен будет перекрывать короткий день (потеря часа весной) и длинный день (получение часа осенью). Вывод, который я ищу, производится по местному времени, то есть с применением часового пояса и смещения летнего времени. Так, например, в Великобритании у нас пропущен час с 01:00 до 01:59 в короткий день, так что результат будет:

00: 00, 02:00, 03: 00

И в длинный день у нас есть дополнительный час с 01:00 до 02:00, такой что результат будет:

00: 00, 01:00, 01:00, 02:00, 03: 00

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

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

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

У кого-нибудь есть идеи о том, как добиться того, чего я добиваюсь?

Ответы [ 2 ]

3 голосов
/ 08 сентября 2011

Если у вас фиксированный часовой пояс, кажется, что работает следующий код JavaScript (протестировано на последней версии Chrome и Firefox 6):

 // set the date to 11 / 04 / 2012 at 00:00 UTC
 var date = new Date(1331424000000);
 for(var i = 1; i <= 12; i++) {   
     $('.data-dston').append(' ' + date.getHours() + ':00, ');
     date = new Date(date.getTime() + 3600000)
 }

 // set the date to 04 / 11 / 2012 at 00:00 UTC
 var date = new Date(1351987200000);
 for(var i = 1; i <= 12; i++) {   
     $('.data-dstoff').append(' ' + date.getHours() + ':00, ');
     date = new Date(date.getTime() + 3600000)
 }

Вот JSFiddle: http://jsfiddle.net/Vsd2A/3/, чтобы увидеть код в действии!

1 голос
/ 09 сентября 2011

Адаптация того, что придумал Кртек (для моего часового пояса - Великобритания), теперь у меня есть следующее:

// set the date to 27 / 03 / 2011 at 00:00 UTC
var date = new Date('27 Mar 2011 00:00');
for(var i = 1; i <= 12; i++)
{   
    $('.data-dston').append(' ' + date.getHours() + ':00, ');
    date.setTime(date.getTime() + 3600000);
}

// set the date to 30 / 10 / 2011 at 00:00 UTC
var date = new Date('30 Oct 2011 00:00');
for(var i = 1; i <= 12; i++)
{   
    $('.data-dstoff').append(' ' + date.getHours() + ':00, ');
    date.setTime(date.getTime() + 3600000)
}

Преимущество в том, что на каждой итерации нет необходимости создавать новый объект.

...