繁体   English   中英

通过JavaScript中的字符串检测夏时制时区

[英]Daylight Savings Timezone Detection From Strings In JavaScript

我到过几个地方看过,但是找不到这个问题的解决方案。 我有一些要导入的数据,对于我来说,它包含表示东部时区 (ET)中日期的字符串。 字符串如下所示:

七月28,2018 03:39下午

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

console.log(new Date('July 28, 2018 03:39 PM EST'));
2018-07-28T19:39:00.000Z

要么

console.log(new Date('July 28, 2018 03:39 PM EDT'));
2018-07-28T20:39:00.000Z

我们可以清楚地看到两者之间相差一小时。 确定是否启用夏令时的规则似乎很复杂,并且可能因地理区域而异。

所以我的问题是:是否有解决方案可以根据某些参数检测适用的时区(日光或标准时间)? 我假设至少需要年,月,日,时间和标准时区?

由于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

您可以尝试一下moment-timezone 考虑到时区规则的复杂性,几乎可以肯定图书馆是有序的。

在下面的示例中,假设每个日期字符串都来自同一台服务器,我们知道该日期设置为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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM