首先,我不是在寻找DST是否在本地生效。
我正在运行一个Node进程,该进程包含具有关联时间戳的数据。我需要在指定的时区将这些时间戳转换为日/月/年,但我给出的只是时区的偏移量和DST偏移量。
我希望日期/时刻能够更好地适应时区。它们适用于UTC或本地时区,但似乎你需要破解它以获得其他东西。
有什么我想念的吗?假设我可以确定DST是否有效,这是否有效:
var d = new Date(ts + timezone_offset - local_offset);
d.getMonth();
d.getDate();
其中timezone_offset是时区的偏移量(标准偏移量或dst值)?
我如何确定DST是否有效?
答案 0 :(得分:3)
首先,要认识到如果您拥有偏移,则无法解决此问题。您必须拥有时区标识符,例如"America/New_York"
。因为在问题评论中你说你确实有这个,所以你可以使用one of these libraries来完成工作。
我之前已经发布了这个问题的另一个答案,推荐TimeZoneJS,但我现在撤回了 - 因为这个问题是关于DST的,而且TimeZoneJS有错误,在DST转换附近错误地报告值。
相反,我现在建议将moment.js与moment-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();