new Date() 在 Chrome 中有效,但在 Firefox 中无效

IT技术 javascript google-chrome date datetime firefox
2021-01-27 06:28:19

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

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

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

在 Firefox 中 date1 给了我一个无效的日期,但在 chrome 中它工作得很好,主要原因是什么?

6个回答

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

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 规范只需要一种日期格式(即 YYYY-MM-DDTHH:mm:ss.sssZ),但实现可以自由支持自定义日期格式:“如果字符串不符合 [ECMAScript 定义的] 格式该函数可能会回退到任何特定于实现的启发式或特定于实现的日期格式。 ” Chrome 和 FF 只是具有不同的“特定于实现的日期格式”。

我得到了一个适用于包括 Firefox 在内的所有浏览器的解决方案:stackoverflow.com/a/21984717/586051
2021-03-18 06:28:19
至于为什么存在这种浏览器差异:EMCAScript 规范只需要一种日期格式(即YYYY-MM-DDTHH:mm:ss.sssZ),但实现可以自由支持自定义日期格式:“如果字符串不符合 [ECMAScript 定义的] 格式,该函数可能会退回到任何特定于实现的启发式方法或特定于实现的日期格式。 ” Chrome 和 FF 只是具有不同的“特定于实现的日期格式”。
2021-03-22 06:28:19
在 Chrome 中有效但在 Firefox 中无效的日期格式(包含“.”的月份)的一个示例:'Feb. 14, 2019'
2021-04-05 06:28:19
如果我添加'到毫秒,这仅在 Firefox 中对我有用Date('milliseconds')否则我收到一个错误,说毫秒未定义,但它至少有效,许多其他试验都失败了。在 Chrome 中似乎仍然很高兴。
2021-04-07 06:28:19

这适用于所有浏览器 -

新日期('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

所以你实际上已经测试了所有浏览器假设你有,你也知道未来所有的浏览器也将支持这种(非标准)格式?
2021-03-12 06:28:19
因为我们都知道这是一个国际标准。w3.org/International/questions/qa-date-format
2021-03-17 06:28:19
3 年后,它不适用于 Edge 和 Window Safari。
2021-03-27 06:28:19
这对我有用。所以如果你已经得到一个字符串 '2001-1-31 12:00:00',我们可以简单地做: new Date(str.replace(/-/g, '/'));
2021-04-08 06:28:19
@JianwuChen 您故意将标准格式修改为非标准格式。不是个好主意。
2021-04-08 06:28:19

选项1 :

假设您的时间字符串具有如下格式:

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

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

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

这将产生以下输出:

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

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

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

选项2:

假设您的时间字符串具有如下格式:

'02-24-2015 09:22:21 PM'

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

'02-24-2015 09:22:21 PM'.replace(/-/g,'/');

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

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

选项 3:

假设您的时间字符串不容易调整到支持良好的标准之一。

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

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

var d = new Date('2017-08-28 08:02 PM'.replace(/-/g,'/')); 这对我在 chrome 和 mozilla 中都非常有效。
2021-04-11 06:28:19

这也适用于大多数浏览器

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

那是格式

"yyyy/MM/dd HH:mm:ss"
不能保证格式可以在任何浏览器中使用,更不用说“所有”了。
2021-03-22 06:28:19
你是对的,答案是基于我的经验。
2021-04-10 06:28:19

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

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

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

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

一定要在末尾添加“Z”字母,否则 Chrome 和 Firefox 会以不同的方式解析字符串(一个会添加时间偏移,另一个不会)。

@JulianJelfs-“如果不存在时区,它应该假设格林威治标准时间”,仅适用于日期(与 ISO 8601 相反)。对于日期和时间字符串,它应该假定为本地(与 ISO 8601 一致)。但无论如何,手动解析是唯一安全的方法。
2021-03-21 06:28:19
是的,如果您不提供时区,则 chrome 和 firefox 的行为会有所不同。而且,出于兴趣,我认为 Firefox 做错了。如果时区不存在,它应该假设格林威治标准时间。Chrome 可以,firefox 不行。 ecma-international.org/ecma-262/5.1/#sec-15.9.1.15
2021-03-24 06:28:19