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

时间:2012-08-27 16:02:24

标签: javascript datejs

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

例如,

  

鉴于日期:2012-08-27T14:57:00Z(ISO 8601格式),显示时间为14:57 UTC,为什么这将被解析为14:57 GMT-400而不是10 :57 GMT-400?

我有created a fiddle来展示它的实际效果。

如果确实存在错误或我对解析结果的理解不正确,请告诉我。

3 个答案:

答案 0 :(得分:10)

是的,这是一个错误 - 甚至a reported one

我可能会建议使用Moment.js库吗?例如,this

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

...将正确识别出UTC时间。

答案 1 :(得分:2)

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

答案 2 :(得分:1)

这是由DateJS的错误实现引起的,而不是其他令人敬畏的语法解析器。

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

用这个替换解析函数:

$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/