Date.js错误地分析了ISO 8601 UTC日期

Date.js parsing an ISO 8601 UTC date incorrectly

本文关键字:ISO 8601 UTC 日期 js 错误 Date      更新时间:2023-09-26

使用javascript库Date.js,我发现当我将一个ISO 8601格式的UTC 0日期传递到Date.parse()函数时,我得到的对象表示相同的日期,但添加了本地时区。

例如,

考虑到日期:2012-08-27T14:57:00Z(ISO 8601格式),显示的时间为14:57 UTC,为什么会将其解析为14:57 GMT-400,而不是10:57 GMT-400?

我制作了一把小提琴来表演。

请告诉我是否真的有错误,或者我对解析结果的理解是否不正确。

是的,这是一个错误,甚至是一个已报告的错误。

我可以推荐使用Moment.js库吗?例如:

console.log(moment('2012-08-27T14:57:00Z').toString());

将正确识别给定的UTC时间。

这似乎是Date.js的错误。使用new Date('2012-08-27T14:57:00Z')返回正确的日期。

这是由DateJS的语法解析器的错误实现引起的。

基本上,旧版本只是检查它是否可以使用内置的解析器,新版本尝试使用语法解析,但忘记先尝试原始步骤,语法解析器无法使用时区(这是一个错误,但不同)。

将解析函数替换为以下函数:

$D.parse = function (s) {
    var date, time, r = null;
    if (!s) {
        return null;
    }
    if (s instanceof Date) {
        return s;
    }
    date = new Date(Date._parse(s));
    time = date.getTime();
    // The following will be FALSE if time is NaN which happens if date is an Invalid Date 
    // (yes, invalid dates are still date objects. Go figure.)
    if (time === time) {
        return date;
    } else {
        // try our grammar parser
        try {
            r = $D.Grammar.start.call({}, s.replace(/^'s*('S*('s+'S+)*)'s*$/, "$1"));
        } catch (e) {
            return null;
        }
        return ((r[1].length === 0) ? r[0] : null);
    }
};

更新版本的核心代码(并将在未来修复开放的错误)可在这里获得:

https://github.com/abritinthebay/datejs/