新的date()在Chrome中工作,但不是Firefox

我正在创build一个如下所示的date时间string: 2010-07-15 11:54:21

在下面的代码中,我在Firefox中得到了无效的date,但在Chrome中工作得很好

 var todayDateTime = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + seconds; var date1 = new Date(todayDateTime); 

在Firefox中date1给了我一个无效的date,但在铬的工作就好了主要的原因是什么?

您不能以任何方式实例化date对象。 它必须以特定的方式。 这里有一些有效的例子:

 new Date() // current date and time new Date(milliseconds) //milliseconds since 1970/01/01 new Date(dateString) new Date(year, month, day, hours, minutes, seconds, milliseconds) 

要么

 d1 = new Date("October 13, 1975 11:13:00") d2 = new Date(79,5,24) d3 = new Date(79,5,24,11,33,0) 

Chrome必须更加灵活。

来源: https : //developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

来自Apsillers的评论:

EMCAScript规范只需要一种date格式 (即,YYYY-MM-DDTHH:mm:ss.sssZ),但实现可以自由支持自定义date格式 :“ 如果string不符合[ECMAScript定义的]格式该function可能会退回到任何特定于实现的启发式或特定于实现的date格式。 “Chrome和FF只是具有不同的”实现特定的date格式“。

这适用于所有浏览器 –

新date('2001/01/31 12:00:00 AM')

 new Date('2001-01-31 12:00:00') 

格式:YYYY-MM-DDTHH:mm:ss.sss

详情: http : //www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15

这也适用于大多数浏览器

 new Date('2001/01/31 12:00:00') 

这是格式

 "yyyy/MM/dd HH:mm:ss" 

如果您仍想使用破折号创builddate,则可以使用以下格式:

 var date = new Date('2013-08-31T17:00:00Z') 

但请记住,它根据UTC创build时间。 意思是说,如果你居住在GMT + 3(格林尼治标准时间前3小时)的时区,它将把时区偏移加到时间上。 所以上面的例子会有这个值,如果GMT + 3(注意是小时20:00而不是17:00):

 Sat Aug 31 2013 20:00:00 GMT+0300 (FLE Standard Time) 

一定要在最后添加'Z'字母,否则Chrome和Firefox将以不同的方式parsingstring(一个会添加时间偏移量,另一个则不会)。

选项1 :

假设你的时间string的格式如下所示:

 '2016-03-10 16:00:00.0' 

在这种情况下,你可以做一个简单的正则expression式来将其转换为ISO 8601

 '2016-03-10 16:00:00.0'.replace(/ /g,'T') 

这将促成以下输出:

 '2016-03-10T16:00:00.0' 

这是标准的date时间格式,因此被所有浏览器支持:

 document.body.innerHTML = new Date('2016-03-10T16:00:00.0') // THIS IS SAFE TO USE 

在使用AngularJS时,我在Firefox和Safari中都遇到了类似的问题。 例如,如果从Angular返回的date如下所示:

 2014-06-02 10:28:00 

使用这个代码:

 new Date('2014-06-02 10:28:00').toISOString(); 

在Firefox和Safari中返回无效的date错误。 然而,在Chrome中,它工作正常。 正如另一个答案所述,Chrome在分析datestring方面可能更为灵活。

我最终的目标是以某种方式格式化date。 我发现了一个很好的库,可以处理跨浏览器兼容性问题和date格式问题。 图书馆叫做moment.js 。

使用这个库,下面的代码可以在我testing过的所有浏览器上正常工作:

 moment('2014-06-02 10:28:00').format('MMM d YY') 

如果您愿意将这个额外的库包含到您的应用程序中,则可以更轻松地构builddatestring,同时避免可能的浏览器兼容性问题。 作为一个奖励,你将有一个很好的方式来轻松地格式化,加,减等date,如果需要的话。

这应该为你工作:

 var date1 = new Date(year, month, day, hour, minute, seconds); 

我不得不创builddateforms的string,所以我已经这样做了:

 var d = '2013-07-20 16:57:27'; var date1 = new Date(d.substr(0, 4), d.substr(5, 2), d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2)); 

请记住,JavaScript中的月份是从0到11,所以你应该减less月份值1,如下所示:

 var d = '2013-07-20 16:57:27'; var date1 = new Date(d.substr(0, 4), d.substr(5, 2) - 1, d.substr(8, 2), d.substr(11, 2), d.substr(14, 2), d.substr(17, 2)); 

我遇到的一种情况是在处理毫秒时。 当试图创build一个新的date时,FF和IE不会正确parsing这个datestring。 "2014/11/24 17:38:20.177Z"他们不知道如何处理.177Z 。 Chrome会工作。

事实上,Chrome可以更灵活地处理不同的string格式。 即使您不知道其string格式,Chrome仍然可以成功将string转换为date而不会出错。 喜欢这个:

  var outputDate = new Date(Date.parse(inputString)); 

但是对于Firefox和Safari,事情变得更加复杂。 实际上,在Firefox的文档中已经说过了:( https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/parse

表示RFC2822或ISO 8601date的string(可能会使用其他格式,但结果可能是意外的)。

所以,当你想在Firefox和Safari中使用Date.parse时,你应该小心。 对我来说,我用一个技巧来处理它。 (注意:对于所有情况可能并不总是正确的)

 if (input.indexOf("UTC") != -1) { var tempInput = inputString.substr(0, 10) + "T" + inputString.substr(11, 8) + "Z"; date = new Date(Date.parse(tempInput)); } 

在这里它首先转换2013-08-08 11:52:18 UTC2013-08-08T11:52:18Z ,然后它的格式在Firefox的文档中是合适的。 在这个时候,Date.parse将永远在任何浏览器中。

在Firefox中,任何无效的date都会返回为date对象Date 1899-11-29T19:00:00.000Z ,因此请检查浏览器是否为Firefox,然后获取string"1899-11-29T19:00:00.000Z".getDate() Date对象"1899-11-29T19:00:00.000Z".getDate() 。 最后再比较一下date。

我已经使用了以下的date格式,它在所有的浏览器中工作。

 var target_date = new Date("Jul 17, 2015 16:55:22").getTime(); var days, hours, minutes, seconds; var countdown = document.getElementById("countdown"); remaining = setInterval(function () { var current_date = new Date().getTime(); var seconds_left = (target_date - current_date) / 1000; days = parseInt(seconds_left / 86400); seconds_left = seconds_left % 86400; hours = parseInt(seconds_left / 3600); seconds_left = seconds_left % 3600; minutes = parseInt(seconds_left / 60); seconds = parseInt(seconds_left % 60); countdown.innerHTML = "<b>"+days + " day, " + hours + " hour, " + minutes + " minute, " + seconds + " second.</b>"; }, 1000);