cat*_*cat 48 javascript safari internet-explorer datetime
我没能在IE8和Safari 5上解析ISO-8601日期"2011-04-26T13:16:50Z",但它适用于Chrome 10,FF4.支持似乎很混杂?
有谁知道哪些浏览器可以解析这种格式的实际状态?我假设IE6,7也会失败.
var d = Date.parse("2011-04-26T13:16:50Z");
Run Code Online (Sandbox Code Playgroud)
cko*_*ozl 32
我说只有通过一些测试才需要它,
这是我已经写过的:
(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);
};
})();
Run Code Online (Sandbox Code Playgroud)
并且在你的代码中总是使用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 /日期语法分析和新日期-失败-上有效的格式
- 如果您关心标准现在/将来的位置以及为什么我不能让IE团队认识到他们的IE10实现在技术上不正确,请阅读此内容:
ECMAScript-262 v6.0将转向稍微更符合iso8601的版本"如果省略时区指示器,假定当地时间"......所以现在存在差异,这种实现,chrome,移动safari和opera all遵循ECMAScript-262 v5.1,而IE10,firefox,桌面游戏似乎都遵循更符合iso8601标准的ECMAScript-262 v6.0规范...这至少令人困惑.当chrome或移动safari拉动触发器并转移到ES6实现时,我认为这个实现应该与它一起使ES5.1成为少数.我已经读过,这是在5.1版的"勘误表"中列出的,虽然我还没有找到它.我更倾向于认为现在推动ES6的触发还为时尚早,但我也认为代码需要实用,不理想,并转向浏览器制造商转向的地方.也就是说,它现在似乎是一个50/50的决定,所以下面是这个代码的"未来"版本......
我还应该提一下,任何一个版本的代码都会规范化"不兼容"的浏览器以匹配另一个浏览器的行为,因为这就是垫片的作用;)
这里适应的版本与ECMAScript-262 v6.0兼容(JavaScript未来)
请参阅此处的相关部分:(这是我能找到的唯一在线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);
};
})();
Run Code Online (Sandbox Code Playgroud)
希望这有助于确定
Ole*_*ika 18
在任何浏览器中解析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;
}
Run Code Online (Sandbox Code Playgroud)
是的,Date.parse对于不同的浏览器不一致.你可以:
| 归档时间: |
|
| 查看次数: |
38118 次 |
| 最近记录: |