7

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

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

我希望日期/时刻在时区方面效果更好。它们适用于 UTC 或本地时区,但似乎您需要破解它才能获得其他东西。

有什么我想念的吗?假设我可以确定 DST 是否生效,这是否可行:

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

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

如何确定 DST 是否生效?

4

3 回答 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
于 2016-01-28T17:00:45.643 回答
0

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

moment(your_date).isDST();
于 2013-02-08T22:44:10.350 回答
0

有什么我想念的吗?假设我可以确定 DST 是否生效,这是否适用timezone_offset于请求的时区偏移量?

尝试始终使用 UTC 方法来获取日期的属性。这样您(服务器的)本地时区将不会影响任何计算:

var d = new Date(ts + timezone_offset);
d.getUTCMonth();
d.getUTCDate();

如何确定 DST 是否生效?

这很复杂。根据地区的不同,有许多不同的算法来确定 DST 的开始和结束 - 例如,请查看http://en.wikipedia.org/wiki/Daylight_saving_time_by_country

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

于 2013-02-08T21:50:13.503 回答