![](/img/trans.png)
[英]Javascript: How to get 2020-05-15T05:00:00Z format date string?
[英]How do I get Internet Explorer to parse “2010-06-09T15:20:00Z” as a date?
我正在使用 JavaScript 来处理组合 UTC 格式的日期(例如“2010-06-09T15:20:00Z”)。 IE 没有给出预期的结果(震惊)。 以下产生NaN。
var d = new Date("2010-06-09T15:20:00Z"); // NaN
然而,微软在这个页面上的文档说这应该可以工作(就像它在 FF 中一样)。 我什至已经从该页面复制了 JScript 代码,但它无法运行,给出了我在工作中发现的相同错误。 (有点让你想知道 MS 在发布之前是否对其进行了测试,或者 IE 是否由于补丁而损坏)。
格式化日期和时间字符串 (msdn.microsoft.com)
我可以通过删除“T”并将破折号切换为斜杠来让 IE 解析类似的字符串。 这样做的问题是我失去了时间的偏移逻辑。
有关如何在 IE 中解决此问题的任何建议。 我已经在 IE6 和 IE7(兼容模式)中对此进行了测试。 我没有另一个 Windows 系统可供检查。
对于无忧的日期操作,我喜欢使用Datejs - 一个开源 JavaScript 日期库,它在日期方面做了很多很棒的事情,使用它的主要成本认为是 26kb 文件大小。
它将解析"2010-06-09T15:20:00Z"
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;
}
})()
我对扩展 Javascript 核心对象的想法感到畏缩,所以我倾向于使用它们。 完全归功于保罗·索登
var regexp = "([0-9]{4})(-([0-9]{2})(-([0-9]{2})" +
"(T([0-9]{2}):([0-9]{2})(:([0-9]{2})(\.([0-9]+))?)?" +
"(Z|(([-+])([0-9]{2}):([0-9]{2})))?)?)?)?";
var d = string.match(new RegExp(regexp));
var offset = 0;
var time;
var date = new Date(d[1], 0, 1);
if (d[3]) { date.setMonth(d[3] - 1); }
if (d[5]) { date.setDate(d[5]); }
if (d[7]) { date.setHours(d[7]); }
if (d[8]) { date.setMinutes(d[8]); }
if (d[10]) { date.setSeconds(d[10]); }
if (d[12]) { date.setMilliseconds(Number("0." + d[12]) * 1000); }
if (d[14]) {
offset = (Number(d[16]) * 60) + Number(d[17]);
offset *= ((d[15] == '-') ? 1 : -1);
}
offset -= date.getTimezoneOffset();
time = (Number(date) + (offset * 60 * 1000));
date.setTime(Number(time));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.