我未能在 IE8 和 Safari 5 上解析 ISO-8601 日期“2011-04-26T13:16:50Z”,但它适用于 Chrome 10、FF4。支持似乎很复杂?
有谁知道哪些浏览器可以解析这种格式的实际状态?我假设 IE6 和 7 也会失败。
var d = Date.parse("2011-04-26T13:16:50Z");
我未能在 IE8 和 Safari 5 上解析 ISO-8601 日期“2011-04-26T13:16:50Z”,但它适用于 Chrome 10、FF4。支持似乎很复杂?
有谁知道哪些浏览器可以解析这种格式的实际状态?我假设 IE6 和 7 也会失败。
var d = Date.parse("2011-04-26T13:16:50Z");
我说只有通过一些测试需要时才填充它,
这是我已经写过的一个:
(function() {
var d = window.Date,
regexIso8601 = /^(\d{4}|\+\d{6})(?:-(\d{2})(?:-(\d{2})(?:T(\d{2}):(\d{2}):(\d{2})\.(\d{1,3})(?:Z|([\-+])(\d{2}):(\d{2}))?)?)?)?$/;
if (d.parse('2011-11-29T15:52:30.5') !== 1322581950500 ||
d.parse('2011-11-29T15:52:30.52') !== 1322581950520 ||
d.parse('2011-11-29T15:52:18.867') !== 1322581938867 ||
d.parse('2011-11-29T15:52:18.867Z') !== 1322581938867 ||
d.parse('2011-11-29T15:52:18.867-03:30') !== 1322594538867 ||
d.parse('2011-11-29') !== 1322524800000 ||
d.parse('2011-11') !== 1320105600000 ||
d.parse('2011') !== 1293840000000) {
d.__parse = d.parse;
d.parse = function(v) {
var m = regexIso8601.exec(v);
if (m) {
return Date.UTC(
m[1],
(m[2] || 1) - 1,
m[3] || 1,
m[4] - (m[8] ? m[8] + m[9] : 0) || 0,
m[5] - (m[8] ? m[8] + m[10] : 0) || 0,
m[6] || 0,
((m[7] || 0) + '00').substr(0, 3)
);
}
return d.__parse.apply(this, arguments);
};
}
d.__fromString = d.fromString;
d.fromString = function(v) {
if (!d.__fromString || regexIso8601.test(v)) {
return new d(d.parse(v));
}
return d.__fromString.apply(this, arguments);
};
})();
并在您的代码中始终使用Date.fromString(...)
而不是new Date(...)
测试浏览器以查看是否会使用垫片:
http://jsbin.com/efivib/1/edit
适用于所有主要浏览器,使用这些参考:
http://dev.w3.org/html5/spec/common-microsyntaxes.html
http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
http://msdn.microsoft.com/en-us/library/windows/apps/ff743760(v=vs.94).aspx
http://msdn.microsoft.com/en-us/library/windows/apps/wz6stk2z(v=vs.94).aspx
http://msdn.microsoft.com/en-us/library/windows/apps/k4w173wk(v=vs.94).aspx
!- microsoft connect 需要登录才能查看:
IE9 以毫秒为单位失败,数字计数不是 3:(在 IE10 中已修复) https://connect.microsoft.com/IE/feedback/details/723740/date-parse-and-new-date-fail-on-valid -格式
当省略时区时,IE10 仍然(截至 2013 年 1 月 17 日)失败(根据 ECMA,这应该默认为 Z 或 UTC,而不是本地):https ://connect.microsoft.com/IE/feedback/ 详细信息/776783/date-parse-and-new-date-fail-on-valid-formats
-- 如果您关心标准现在/将来的发展方向以及为什么我无法让 IE 团队认识到他们的 IE10 实现在技术上是不正确的,请阅读此内容:
ECMAScript-262 v6.0 将移至更符合 ISO8601 的版本“如果省略时区指示器,则假定为本地时间”...所以现在有一个差异,这个实现,chrome,mobile safari 和 opera遵循 ECMAScript-262 v5.1,而 IE10、firefox、桌面 safari 似乎都遵循更符合 iso8601 的 ECMAScript-262 v6.0 规范......至少可以说这令人困惑。当 chrome 或 mobile safari 扣动扳机并转向 ES6 实现时,我认为这个实现应该随之而来,将 ES5.1 留在少数。我已经读到这列在 5.1 版的“勘误表”中,但我还没有找到。我更倾向于认为现在在 ES6 上扣动扳机还为时过早,但我' 我还认为代码需要实用,而不是理想的,并移动到浏览器制造商移动的地方。也就是说,现在似乎是 50/50 的决定,所以下面是这段代码的“未来”版本......
我还应该提到,代码的任一版本都会使“不合规”浏览器规范化以匹配另一个版本的行为,因为这就是 shims 的作用;)
这是与 ECMAScript-262 v6.0 兼容的改编版本(JavaScript Future)
请在此处查看相关部分:(这是我能找到的唯一在线 html 版规范)http://people.mozilla.org/~jorendorff/es6-draft.html#sec-15.9.1.15
(function() {
var d = window.Date,
regexIso8601 = /^(\d{4}|\+\d{6})(?:-(\d{2})(?:-(\d{2})(?:T(\d{2}):(\d{2}):(\d{2})\.(\d{1,})(Z|([\-+])(\d{2}):(\d{2}))?)?)?)?$/,
lOff, lHrs, lMin;
if (d.parse('2011-11-29T15:52:30.5') !== 1322599950500 ||
d.parse('2011-11-29T15:52:30.52') !== 1322599950520 ||
d.parse('2011-11-29T15:52:18.867') !== 1322599938867 ||
d.parse('2011-11-29T15:52:18.867Z') !== 1322581938867 ||
d.parse('2011-11-29T15:52:18.867-03:30') !== 1322594538867 ||
d.parse('2011-11-29') !== 1322524800000 ||
d.parse('2011-11') !== 1320105600000 ||
d.parse('2011') !== 1293840000000) {
d.__parse = d.parse;
lOff = -(new Date().getTimezoneOffset());
lHrs = Math.floor(lOff / 60);
lMin = lOff % 60;
d.parse = function(v) {
var m = regexIso8601.exec(v);
if (m) {
return Date.UTC(
m[1],
(m[2] || 1) - 1,
m[3] || 1,
m[4] - (m[8] ? m[9] ? m[9] + m[10] : 0 : lHrs) || 0,
m[5] - (m[8] ? m[9] ? m[9] + m[11] : 0 : lMin) || 0,
m[6] || 0,
((m[7] || 0) + '00').substr(0, 3)
);
}
return d.__parse.apply(this, arguments);
};
}
d.__fromString = d.fromString;
d.fromString = function(v) {
if (!d.__fromString || regexIso8601.test(v)) {
return new d(d.parse(v));
}
return d.__fromString.apply(this, arguments);
};
})();
希望这有帮助 -ck
我今天遇到了这个问题。我发现momentjs是在跨浏览器庄园中解析 ISO 8601 日期的好方法。
momentjs 也可用于以不同格式输出日期。
在任何浏览器中解析 ISO8601 日期格式的简单函数:
function dateFromISO8601(isoDateString) {
var parts = isoDateString.match(/\d+/g);
var isoTime = Date.UTC(parts[0], parts[1] - 1, parts[2], parts[3], parts[4], parts[5]);
var isoDate = new Date(isoTime);
return isoDate;
}
是的,不同浏览器的 Date.parse 不一致。你可以:
如果您解析 ISO 日期字符串,一些较旧的浏览器会返回错误的日期(而不是 NaN)。
您可以在所有浏览器中使用您自己的方法,或者使用 Date.parse(如果它实现正确的话)——检查一个已知的时间戳。
Date.fromISO= (function(){
var diso= Date.parse('2011-04-26T13:16:50Z');
if(diso=== 1303823810000) return function(s){
return new Date(Date.parse(s));
}
else return function(s){
var day, tz,
rx= /^(\d{4}\-\d\d\-\d\d([tT][\d:\.]*)?)([zZ]|([+\-])(\d\d):(\d\d))?$/,
p= rx.exec(s) || [];
if(p[1]){
day= p[1].split(/\D/).map(function(itm){
return parseInt(itm, 10) || 0;
});
day[1]-= 1;
day= new Date(Date.UTC.apply(Date, day));
if(!day.getDate()) return NaN;
if(p[5]){
tz= parseInt(p[5], 10)*60;
if(p[6]) tz += parseInt(p[6], 10);
if(p[4]== "+") tz*= -1;
if(tz) day.setUTCMinutes(day.getUTCMinutes()+ tz);
}
return day;
}
return NaN;
}
})()