在不同浏览器中解析日期

时间:2014-11-17 12:56:47

标签: javascript date browser

我想要解析日期2014-11-17 16:00的div。这就是我的方式:

var beginDate = new Date((document.getElementById('beginDate').innerHTML))
            .getTime();

Chrome显示的是millis,但不包括Safari和Firefox:

NaN

怎么了?

第二次努力:

var beginDateStr = document.getElementById('beginDate').innerHTML;
beginDateStr = beginDateStr.split(' ').join('T');   
var beginDate = new Date(beginDateStr);

我有Invalid Date

第三项努力:

var beginDateStr = document.getElementById('beginDate').innerHTML;
beginDateStr = beginDateStr.split(' ').join('T');
beginDateStr = beginDateStr.replace(/\s/g, "");
console.log(beginDateStr);
var beginDate = new Date(beginDateStr);
var currentDate = new Date().getTime();
console.log(beginDate);

在Chrome中

2014-11-17T16:00
Mon Nov 17 2014 19:00:00 GMT+0300 (RTZ 2 (зима)) 

错误的时间。

在Firefox中

2014-11-17T16:00
2014-11-17T13:00:00.000Z

甚至不平等。

5 个答案:

答案 0 :(得分:2)

您可以查看http://momentjs.com/ 它可以运行不同的浏览器。

答案 1 :(得分:1)

new Date(dateString)(和它的等价物,Date.parse()并不是一个通用的启发式日期解析器。有趣的是,它仅以标准形式解析日期。来自MDN页面:

  

它接受RFC2822 / IETF日期语法(RFC2822第3.3节),例如“星期一,1995年12月25日13:30:00 GMT”。

和ES5

  

日期时间字符串可以是ISO 8601格式。例如,“2011-10-10”(仅限日期)或“2011-10-10T14:48:00”(日期和时间)

除此之外,浏览器可以做任何他们喜欢的事情:

  

ECMAScript规范指出:如果String不符合标准格式,则该函数可以回退到任何特定于实现的启发式或特定于实现的解析算法。

浏览器在解释标准日期格式的偏差方面有多么宽松。 Chrome更宽容(或者你可以称之为不太合规),FF则不那么。

在您的情况下,2014-11-17T16:00将在所有符合标准的浏览器中正确解析。

但是,正如您所发现的,不同的浏览器可能会对时区做出不同的假设。虽然MDN页面说明了

  

如果日期字符串为“2014年3月7日”,则parse()会假定一个本地时区,但如果采用ISO格式(如“2014-03-07”),则会假定为UTC时区。

看来如果没有指定偏移(例如+0530),FF似乎采用本地时区,而Chrome则采用UTC:

FF:

new Date("2014-11-17T18:30")
Date 2014-11-17T13:00:00.000Z
toLocaleString: "11/17/2014, 6:30:00 PM"

铬:

new Date("2014-11-17T18:30")
Tue Nov 18 2014 00:00:00 GMT+0530 (India Standard Time)
toLocaleString: "11/18/2014, 12:00:00 AM"

唯一可以确定的方法是明确指定偏移量。

答案 2 :(得分:0)

如果您知道日期部件顺序已修复,请使用明确的串行构造函数:

var parts = "2014-11-17 16:00".split(/[-\s:]/);
var dt = new Date(parts[0], +parts[1] - 1, parts[2], parts[3], parts[4], 0, 0);

答案 3 :(得分:0)

我建议使用jquery datepicker parseDate函数。 (如果您使用的是jQuery UI)

但不幸的是,我不知道它是否可以处理小时和分钟。

var beginDate = jQuery.datepicker.parseDate("yy-mm-dd", document.getElementById('beginDate').innerHTML).getTime();

答案 4 :(得分:0)

尝试使用此脚本进行第四次尝试:

str  = (document.getElementById("beginDate").innerHTML).split(/\-|\s/);
dateString = new Date(str.slice(0,3).join('/')+' '+str[3]);
datetime = dateString.getTime();
document.write(datetime);

还要注意输入中不应有多余的空格。