2017-03-27 95 views
-1

我正在处理需要处理大量“日期”的项目。我注意到,有时的JavaScript在不同浏览器的行为不同:javascript在不同浏览器中的行为有所不同

代码:

new Date("Mar 30, 2017".replace(',', '').replace(/ /g, '/')) 

我知道我并不需要使用replace创建日期,但是这个代码给我从Chrome和Safari有趣的不同结果。

当我运行:

"Mar 30, 2017".replace(',', '').replace(/ /g, '/') 

Chrome和Safari浏览器会带给我:"Mar/30/2017"。但是,当我试图把结果变成Date对象,有趣的结果将是:

Chrome: Thu Mar 30 2017 00:00:00 GMT-0700 (PDT) 
Firefox: Date 2017-03-30T07:00:00.000Z 
Safari: Invalid Date 

我已经检查这两个浏览器Javascript的版本,它们都使用相同的版本(1.7)。任何人都可以解释为什么Chrome在这方面的行为与Safari不同?

UPDATE 我知道"Mar/30/2017"不是有效的日期格式。但我的问题是为什么JavaScript在不同的浏览器中表现不同。对于抱怨我日期格式的答案。请在回答之前阅读问题。我会采取@Felix Kling的回答,并感谢所有的答案。

+1

是的,如果您将非标准日期格式传递给'new Date()',那么您会得到不同的结果。只传递[标准格式](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)或者尽可能避免传递字符串。 – JJJ

+0

Safari的JS实现可能只是无法理解它,为什么你需要创建一个日期为“2017年3月/ 30”第一种方式应该工作正常[W3日期文档](https://www.w3schools.com /jsref/jsref_obj_date.asp) –

+2

那么,因为'“Mar/30/2017”'根据我所知的任何规范都不是有效的日期格式。浏览器可以以任何他们想要的方式解释它,或者根本不用,正如你在这里可以观察到的那样。 – Timo

回答

0

任何人都可以解释为什么Chrome浏览器在这方面的行为与Safari不同吗?

specification说,处理未知的日期格式依赖于实现:

[...]字符串可以被解释为本地时间,UTC时间,或在其他一些时间的时间区域,具体取决于字符串的内容。函数首先尝试根据日期时间字符串格式(20.3.1.16)中调用的规则(包括扩展年份)解析字符串的格式。如果字符串不符合该格式,该函数可能会回退到任何特定于实现的启发式或实现特定的日期格式。 [...]

Safari和Chrome使用不同的JavaScript引擎,因此它们的行为在这种情况下可能(并且会有所不同)。

相关问题