JavaScript日期 - 如何知道给定时区是否正在实行夏令时

7
首先,我不是在寻找当前是否实施夏令时。
我正在运行一个Node进程,其中包含带有时间戳的数据。我需要将这些时间戳转换为指定时区的日/月/年,但我只获得了该时区的偏移量和DST偏移量。
我希望Date / Moment在处理时区方面能更好地工作。它们在UTC或本地时区方面表现出色,但似乎需要通过一些技巧才能获得其他内容。
我是否遗漏了什么?假设我可以确定DST是否生效,那么这样做是否可行:
var d = new Date(ts + timezone_offset - local_offset);
d.getMonth();
d.getDate();

时区偏移量是指标准偏移量或夏令时偏移量中的一个,如何确定是否正在执行夏令时?

我该如何确定是否正在执行夏令时?


这是一个重复的问题吗:https://dev59.com/sG445IYBdhLWcg3wWZAU?rq=1 - kmote
这其实很容易,你只需要进行一些日期比较,可以查看我的存储库以获取更详细的示例:https://github.com/jthoburn/Date.toString.js - runspired
1
@runspired - 请查看我在您的库这里上的评论。谢谢。 - Matt Johnson-Pint
1
@MattJohnson 我同时拥有 "America/New_York" 和 gmt -5,dst -4。 - user1756980
@user1756980 这不是一个好的计划。不同时区的日期差异很大,即使在相同的时区,它们也会随着年份的变化而改变。我已经几乎完成了使用TimezoneJS实现您想要的样例,并将很快发布。 - Matt Johnson-Pint
显示剩余6条评论
3个回答

3
首先,你需要意识到如果你只有偏移量,你无法解决这个问题。你必须拥有一个时区标识符,例如"America/New_York"。由于在问题评论中你说你确实有这个,那么你可以使用 这些库之一 来完成任务。
我之前曾经发布过另一个回答,推荐使用TimeZoneJS,但是现在我会撤回那个回答-因为这个问题特别涉及到DST,并且TimeZoneJS有缺陷,在DST转换期间错误地报告值。
相反,我现在建议使用moment.jsmoment-timezone插件。安装这两个库后(请务必按照文档加载实际的时区数据),代码非常简单:
moment(timestamp).tz(timezone).isDST()

例如:

moment(1451624400000).tz('America/New_York').isDST(); // false
moment(1467345600000).tz('America/New_York').isDST(); // true

如果您的时间戳已经是以本地时间为字符串形式存在的,则可以使用以下语法:
moment.tz('2016-01-01T00:00:00','America/New_York').isDST(); // false
moment.tz('2016-07-01T00:00:00','America/New_York').isDST(); // true

这个库是否像timezoneJS一样,在底层使用Date对象作为代理?还是他们从头开始实现了所有功能? - matf
Moment本身目前确实在某些方面使用Date对象,但考虑到各种怪癖。尽管如此,我们还有一个未解决的问题需要考虑删除它。Moment-timezone在时区方面完全从头开始实现了所有内容。它不依赖于Date对象进行时区转换。 - Matt Johnson-Pint
我已经测试了一些时区JS无法处理的情况,并且使用moment-timezone可以正确地工作。 - matf

0
有什么我漏掉的吗?假设我可以确定是否启用了DST,那么这个代码是否适用,其中timezone_offset是所请求的时区偏移量?
尝试始终使用UTC方法来获取日期属性。这样你(服务器)的本地时区就不会影响任何计算:
var d = new Date(ts + timezone_offset);
d.getUTCMonth();
d.getUTCDate();

我如何确定夏令时是否生效?
这很复杂。有许多不同的算法来确定夏令时的开始和结束时间,这取决于地区 - 例如,请参阅http://en.wikipedia.org/wiki/Daylight_saving_time_by_country
我不知道是否有任何已编码这些内容的库,或者甚至联系时区数据库以获取正确的信息。最后的选择是询问用户本人有关时区的详细信息。

0

moment.js(http://momentjs.com/)有一个isDST函数。你可以使用moment(更简单),或者查看它是如何实现的。

moment(your_date).isDST();

3
只有在检查日期是否处于本地夏令时时区时,才能正常工作。而不是其他任意时区。 - Matt Johnson-Pint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接