Explorer上的JavaScript日期对象问题

时间:2011-12-26 14:17:13

标签: javascript

我遇到了一个奇怪的问题,即Internet Explorer没有将有效的字符串日期转换为JavaScript Date方法。

字符串如下:

2011-12-26T13:55:49.377Z

它在Chrome和Firefox上运行良好,但在Explorer上却没有。

这是代码:

var now = new Date;
var call_start = new Date(call.start);
var difference = now .getTime() - call_start.getTime();

call.start有效但call_startNaN,因此差异为NaN

这里有什么问题?

我真的需要毫秒......

2 个答案:

答案 0 :(得分:1)

我们最近遇到同样的问题,

easyer方法是爆炸你的字符串或使用正则表达式并使用方法手动设置日期对象的每个部分

function getDateFromString(dString){
  var d = new Date(), m=dString.match(/(\d\d\d\d)-(\d\d)-(\d\d)T(\d\d):(\d\d):(\d\d).(\d\d\d)Z/);
  d.setFullYear(m[1]);             // Sets the day of the month
  d.setMonth(parseInt(m[2],10)-1); // Sets the month (from 0-11)
  d.setDate(m[3]);                 // Sets the day of the month (from 1-31)
  d.setHours(m[4]);                // Sets the hour (from 0-23)
  d.setMinutes(m[5]);              // Set the minutes (from 0-59)
  d.setSeconds(m[6]);              // Sets the seconds (from 0-59)
  d.setMilliseconds(m[7]);         // Sets the milliseconds (from 0-999)
  return d;
}

感谢来自microsoft的crapy Jscript实现

答案 1 :(得分:1)

function dateFromGMTString(str) {
  var x=str.match(/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})\.(\d{1,3})Z/);
  return new Date(x[1],(+x[2])-1,x[3],x[4],x[5],x[6],x[7]);
}

<强>更新

您可以尝试使用Date.parse()方法而不是Date contructor将GMT(JSON)等日期转换为javascript Date对象。在这种情况下,您可以使用下一个代码示例尝试“patch” Date.parse()。只需在页面javascript代码开头的任何地方添加此代码:

if(Date.parse("2000-01-01T00:00:00.000Z")+new Date().getTimezoneOffset()*60000!==(+new Date(2000,0,1,0,0,0,0))) {
  (function() { // closure
    var rg=/(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})\.(\d{1,3})Z/,
        parseOriginal=Date.parse;
    Date.parse=function(str) {
      var x=str.match(rg);
      return x?(+new Date(x[1],(+x[2])-1,x[3],x[4],x[5],x[6],x[7]))-new Date().getTimezoneOffset()*60000:parseOriginal.call(Date,str);
    }
  })();
}

执行上述代码后,您可以在所有浏览器(包括IE)中使用Date.parse(),使用下一代码将字符串日期转换为javascript日期对象:

new Date(Date.parse("2011-12-26T13:55:49.377Z"));