使用 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?
我创建了一个小提琴来展示它。
如果确实有错误,或者我对解析结果的理解不正确,请告诉我。
使用 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?
我创建了一个小提琴来展示它。
如果确实有错误,或者我对解析结果的理解不正确,请告诉我。
这似乎是 Date.js 的错误。使用new Date('2012-08-27T14:57:00Z')返回正确的日期。
它是由 DateJS 的非常棒的语法分析器的错误实现引起的。
基本上旧版本只是检查它是否可以使用内置解析器,新版本尝试使用语法解析但忘记首先尝试原始步骤并且语法解析器无法使用时区(这是一个错误,但是不同的)。
用这个替换 parse 函数:
$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);
}
};
此处提供了核心代码的更新版本(并将在未来修复未解决的错误):