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

使用JavaScript库Date.js我发现,当我传入Date.parse()函数ISO 8601格式化UTC 0日期我得到一个对象是代表同一日期,但与本地时区添加。

例如,

给定日期:2012-08-27T14:57:00Z(采用ISO 8601格式),显示UTC时间14:57,为什么这会被解析为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/

链接地址: http://www.djcxy.com/p/46587.html

上一篇: Date.js parsing an ISO 8601 UTC date incorrectly

下一篇: what kind of format is this?