需要使用 Javascript 日期对象在 DST 转换中显示本地时间

Posted

技术标签:

【中文标题】需要使用 Javascript 日期对象在 DST 转换中显示本地时间【英文标题】:Need to display local times over DST transitions using Javascript Date Object 【发布时间】:2011-11-10 18:04:24 【问题描述】:

我试图在 javascript 中(因此在 Firefox 等网络浏览器中)以小时(按小时)间隔输出一系列时间。这一系列时间将重叠短日(春季减少一小时)和长日(秋季增加一小时)。我正在寻找的输出是当地时间,即应用了时区和 DST 偏移量。例如,在英国,我们在短暂的一天中从 01:00 到 01:59 缺少一个小时,因此输出将是:

00:00、02:00、03:00

在漫长的一天中,我们从 01:00 到 02:00 有一个额外的小时,这样输出将是:

00:00、01:00、01:00、02:00、03:00

我已经找到了这两个出色的答案,它们突出了一些陷阱并解决了我的部分问题:

Daylight saving time and time zone best practices Javascript Date objects and Daylight Savings Time

但真正的困难在于让 javascript 意识到上面提到的第二个问题中指出的这个缺失和额外的时间(可以这么说)。

我认为一个潜在的解决方案是在 UTC(又名 GMT)下运行,然后转换为当地时间,但我正在努力寻找如何做到这一点。

有人对如何实现我的目标有任何想法吗?

【问题讨论】:

【参考方案1】:

如果你有一个固定的时区,下面的 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/ 以查看实际代码!

【讨论】:

感谢 Krtek,我已经采用了您的示例并对其进行了调整,如我的回答中所示。【参考方案2】:

适应 Krtek 提出的内容(对于我的时区 - 英国),我现在有以下内容:

// 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)

这样做的好处是不必在每次迭代时都构造一个新对象。

【讨论】:

以上是关于需要使用 Javascript 日期对象在 DST 转换中显示本地时间的主要内容,如果未能解决你的问题,请参考以下文章

自 DST 日期起获取行的正确方法?

DST 和 PHP 日期和时间戳

如何比较 DST 与 Laravel / Carbon 更改时的日期

PostgreSQL:无法使用 DST 使时区正常工作

如果日期是进行 DST(夏令时)更改的实际日期,有没有办法在 Python 中推断?

Oracle.ManagedDataAccess 错误地读取 DST 日期