新的Date()适用于Chrome,但不适用于Firefox

pix*_*dev 84 javascript firefox datetime google-chrome date

我正在创建一个如下所示的日期时间字符串: 2010-07-15 11:54:21

使用以下代码我在Firefox中获得无效日期,但在Chrome中运行良好

var todayDateTime = year + '-' + month + '-' + day + ' ' + hour + ':' + minute + ':' + seconds;
var date1 = new Date(todayDateTime);
Run Code Online (Sandbox Code Playgroud)

在firefox中,date1给了我一个无效的日期,但在chrome中它的工作正常,主要原因是什么?

Chr*_*nte 77

您无法以任何方式实例化日期对象.它必须以特定的方式.以下是一些有效的例子:

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)
Run Code Online (Sandbox Code Playgroud)

要么

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

Chrome必须更加灵活.

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

来自apsillers评论:

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

  • 至于为什么存在这种浏览器差异:EMCAScript规范[只需要一种日期格式](http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15)(即,'YYYY- MM-DDTHH:mm:ss.sssZ`)但[自定义日期格式可由实现自由支持](http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.4.2) :"*如果字符串不符合[ECMAScript定义]格式,则该函数可能会回退到任何特定于实现的启发式或特定于实现的日期格式.*"Chrome和FF只是具有不同的"特定于实现的日期格式". " (6认同)
  • 我得到了一个适用于所有浏览器的解决方案,包括Firefox:http://stackoverflow.com/a/21984717/586051 (2认同)

Tah*_*man 21

这适用于所有浏览器 -

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

new Date('2001-01-31 12:00:00')
Run Code Online (Sandbox Code Playgroud)

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

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

  • 所以你实际上已经测试了**所有浏览器**?假设你有,你也知道未来的所有浏览器也会支持那种(非标准)格式吗? (6认同)
  • 3年后,它不适用于Edge and Window Safari. (2认同)

Alv*_*vis 12

这也适用于大多数浏览器

new Date('2001/01/31 12:00:00')
Run Code Online (Sandbox Code Playgroud)

这是格式

"yyyy/MM/dd HH:mm:ss"
Run Code Online (Sandbox Code Playgroud)

  • 无法保证格式在任何浏览器中都能正常工作,更不用说"全部"了. (3认同)

Joh*_*ers 11

选项1 :

假设您的时间段具有如下格式:

'2016-03-10 16:00:00.0'
Run Code Online (Sandbox Code Playgroud)

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

'2016-03-10 16:00:00.0'.replace(/ /g,'T')
Run Code Online (Sandbox Code Playgroud)

这将产生以下输出:

'2016-03-10T16:00:00.0'
Run Code Online (Sandbox Code Playgroud)

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

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

选项2:

假设您的时间段具有如下格式:

'02-24-2015 09:22:21 PM'
Run Code Online (Sandbox Code Playgroud)

在这里,您可以执行以下正则表达式:

'02-24-2015 09:22:21 PM'.replace(/-/g,'/');
Run Code Online (Sandbox Code Playgroud)

这也产生了所有浏览器支持的格式:

document.body.innerHTML = new Date('02/24/2015 09:22:21 PM') // THIS IS SAFE TO USE
Run Code Online (Sandbox Code Playgroud)

选项3:

假设您有一个时间字符串,不容易调整到一个良好支持的标准.

在这种情况下,最好将时间字符串拆分为不同的部分,并将它们用作以下各项参数Date:

document.body.innerHTML = new Date(2016, 2, 26, 3, 24, 0); // THIS IS SAFE TO USE
Run Code Online (Sandbox Code Playgroud)

  • var d = new Date('2017-08-28 08:02 PM'.replace(/-/g,'/')); 这对我在 chrome 和 mozilla 中都非常有效。 (2认同)

Gab*_*ius 8

如果您仍想使用短划线创建日期,则可以使用以下格式:

var date = new Date('2013-08-31T17:00:00Z')
Run Code Online (Sandbox Code Playgroud)

但请记住,它会根据UTC创造时间.这意味着,如果您居住在GMT + 3(比GMT提前3小时)时区,它会将此时区偏移量添加到时间.所以上面的例子将有这个值,如果GMT + 3(注意它是小时20:00而不是17:00):

Sat Aug 31 2013 20:00:00 GMT+0300 (FLE Standard Time)
Run Code Online (Sandbox Code Playgroud)

请务必在末尾添加"Z"字母,否则Chrome和Firefox会以不同方式解析字符串(一个会添加时间偏移,另一个则不会).


Sna*_*hot 5

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

2014-06-02 10:28:00
Run Code Online (Sandbox Code Playgroud)

使用此代码:

new Date('2014-06-02 10:28:00').toISOString();
Run Code Online (Sandbox Code Playgroud)

在Firefox和Safari中返回无效的日期错误.但是在Chrome中它运行正常.正如另一个答案所述,Chrome很可能在解析日期字符串时更灵活.

我最终的目标是以某种方式格式化日期.我找到了一个很好的库来处理跨浏览器兼容性问题和日期格式问题.该库名为moment.js.

使用此库,以下代码可在我测试的所有浏览器中正常运行:

moment('2014-06-02 10:28:00').format('MMM d YY')
Run Code Online (Sandbox Code Playgroud)

如果您愿意将这个额外的库包含到您的应用程序中,您可以更轻松地构建日期字符串,同时避免可能的浏览器兼容性问题.作为奖励,如果需要,您可以轻松地格式化,添加,减去等日期.