从JavaScript中的字符串检测夏令时时区

从JavaScript中的字符串检测夏令时时区,javascript,datetime,time,timezone,Javascript,Datetime,Time,Timezone,我找了好几个地方,但找不到解决这个问题的办法。我有一些我正试图导入的数据,在我的例子中,它包含表示(ET)中日期的字符串。字符串如下所示: let dateString = 'July 28, 2018 03:39 PM' let timeZone = getStandardOrDaylightSavingsTZ(dateString, 'EST'); // "timeZone" would be set back to EDT right now because it's daylight s

我找了好几个地方,但找不到解决这个问题的办法。我有一些我正试图导入的数据,在我的例子中,它包含表示(ET)中日期的字符串。字符串如下所示:

let dateString = 'July 28, 2018 03:39 PM'
let timeZone = getStandardOrDaylightSavingsTZ(dateString, 'EST');
// "timeZone" would be set back to EDT right now because it's daylight savings
console.log(new Date(dateString + ' ' + timeZone));
2018-07-28T20:39:00.000Z
2018年7月28日下午3:39

如果我尝试在JavaScript中创建新的日期对象,我可以创建新的日期对象,但问题是没有
ET
时区,因此我可以使用
EST
(东部标准时间)或
EDT
(东部夏时制)创建它

我们可以清楚地看到两者相差一小时。确定夏令时是否处于活动状态的规则似乎有所不同,并且可能因地理区域而异

所以我的问题是:是否有任何解决方案可以基于某些参数检测适用的时区(日光或标准)?我想至少需要年、月、日、时间和标准时区

我找不到解决这个问题的任何方法,因为JavaScript将所有日期存储在UTC中。除非我能找到我正在解析的字符串的标准/夏令时时区,否则我无法可靠地创建日期对象

我可以很容易地为东部时间解决这个问题,但是,我确信存在更好的方法来解决所有时区的问题

我要寻找的解决方案类型如下:

let dateString = 'July 28, 2018 03:39 PM'
let timeZone = getStandardOrDaylightSavingsTZ(dateString, 'EST');
// "timeZone" would be set back to EDT right now because it's daylight savings
console.log(new Date(dateString + ' ' + timeZone));
2018-07-28T20:39:00.000Z
你可以试试。考虑到时区规则的复杂性,几乎可以肯定图书馆是有序的

在下面的示例中,假设每个日期字符串来自同一个服务器,我们知道该服务器被设置为ET。我们在构造函数中设置时区,给定解析的日期在日历上的位置,以及该区域设置的时区规则,它返回正确的时间

输出为ISO以进行验证

var moment = require('moment-timezone');

var dates = [
    'March 10, 2018 03:39 PM',
    'March 11, 2018 03:39 PM',
];

for (let d of dates) {
    iso = moment.tz(d, "MMMM DD, YYYY hh:mm A", "America/Toronto").toISOString();
    console.log(iso);
}

// Daylight saving time began at 3:00 a.m. on Sunday, March 11
// 2018-03-10T20:39:00.000Z
// 2018-03-11T19:39:00.000Z

很好的解决方案-我实际上在早些时候尝试过,但不知何故没有得到这个结果。请注意,如果您编写的是现代JavaScript,并且不需要底层浏览器支持,那么“时刻”团队建议应该优先使用“时刻”和“时刻时区”。还有其他几个很棒的图书馆。
var moment = require('moment-timezone');

var dates = [
    'March 10, 2018 03:39 PM',
    'March 11, 2018 03:39 PM',
];

for (let d of dates) {
    iso = moment.tz(d, "MMMM DD, YYYY hh:mm A", "America/Toronto").toISOString();
    console.log(iso);
}

// Daylight saving time began at 3:00 a.m. on Sunday, March 11
// 2018-03-10T20:39:00.000Z
// 2018-03-11T19:39:00.000Z