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

时间:2013-02-08 19:54:05

标签: javascript node.js timezone dst

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

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

我希望日期/时刻能够更好地适应时区。它们适用于UTC或本地时区,但似乎你需要破解它以获得其他东西。

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

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

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

我如何确定DST是否有效?

3 个答案:

答案 0 :(得分:3)

首先,要认识到如果您拥有偏移,则无法解决此问题。您必须拥有时区标识符,例如"America/New_York"。因为在问题评论中你说你确实有这个,所以你可以使用one of these libraries来完成工作。

我之前已经发布了这个问题的另一个答案,推荐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

答案 1 :(得分: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

我不知道是否有任何已编码这些的库,或者甚至可能会联系timezone database以获取正确的信息。最后一种方法是询问用户自己的时区详情。

答案 2 :(得分:0)

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

moment(your_date).isDST();