需要使用 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 与 Laravel / Carbon 更改时的日期