Javascript日期-如何知道夏令时是否在给定时区生效

Javascript Date - how to know whether DST is in effect in a given timezone

本文关键字:定时区 是否 夏令时 日期 何知道 Javascript      更新时间:2023-09-26

首先,我不是在寻找DST是否在本地生效。

我正在运行一个Node进程,该进程的数据具有关联的时间戳。我需要将这些时间戳转换为指定时区的天/月/年,但我得到的只是时区的偏移量和夏令时偏移量。

我希望日期/时刻能更好地与时区配合使用。它们与UTC或本地时区配合得很好,但似乎你需要破解它才能获得其他东西。

我缺了什么吗?假设我可以确定DST是否有效,这会起作用吗:

var d = new Date(ts + timezone_offset - local_offset);
d.getMonth();
d.getDate();

其中,timezone_offset是时区的偏移量(标准偏移量或dst偏移量)?

如何确定夏令时是否有效?

首先,要认识到,如果只有偏移,则无法解决此问题。您必须具有时区标识符,例如"America/New_York"。既然你在问题评论中说你确实有这个,那么你可以使用其中一个库来完成任务。

我之前发布了这个问题的另一个答案,推荐TimeZoneJS,但我现在收回这个答案——因为这个问题是专门关于DST的,而TimeZoneJS有错误,在DST转换附近报告值不正确。

相反,我现在建议使用moment.js和moment时区插件。一旦安装了这两个库(确保根据文档加载实际时区数据),代码就非常简单:

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

我有什么东西不见了吗?假设我可以确定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例如

我不知道是否有任何库已经对这些进行了编码,甚至可能联系时区数据库以获取正确的信息。最后的办法是询问用户自己的时区详细信息。

moment.js(http://momentjs.com/)具有isDST函数。您可以使用moment(简单得多),或者检查它是如何实现的。

moment(your_date).isDST();