Javascriptdate – 如何知道DST是否在给定的时区生效

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

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

我希望date/时刻与时区更好地工作。 他们与UTC或本地时区很好地工作,但似乎你需要破解它来获得别的东西。

有什么我失踪? 假设我可以确定DST是否有效,这个工作是否可行:

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

timezone_offset是时区的偏移量(标准偏移量还是dst偏移量)?

我如何确定DST是否有效?

首先,要认识到,如果你所有的都是偏移量 ,你不能解决这个问题。 您必须拥有时区标识符,例如"America/New_York" 。 因为在你所说的问题评论中确实有这个,那么你可以使用这些库中的一个来完成工作。

我之前曾经发布过这个问题的另一个答案,build议TimeZoneJS ,但我现在要收回 – 因为这个问题是专门关于DST的,TimeZoneJS有错误,在DST转换附近错误地报告了值。

相反,我现在推荐使用moment.js和时区附加组件。 一旦安装了两个库(确保加载实际的时区数据,每个文档),代码非常简单:

 moment(timestamp).tz(timezone).isDST() 

例如:

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

或者,如果您的时间戳在本地时间方面已经是string,则使用以下语法:

 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方法来获取date的属性。 这样你的(服务器)本地时区将不会影响任何计算:

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

我如何确定DST是否有效?

这很复杂。 有很多不同的algorithm来确定DST的开始和结束,取决于地区 – 例如,看看http://en.wikipedia.org/wiki/Daylight_saving_time_by_country

我不知道是否有任何已经编码过的库,或者甚至可以联系时区数据库获取正确的信息。 最后的手段是要求用户自己提供时区的详细信息。

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

 moment(your_date).isDST();