alert(new Date('2010-11-29'));

Chrome, ff在这方面没有问题,但safari会喊“无效日期”。为什么?

编辑:好的,根据下面的评论,我使用了字符串解析,并尝试了这个:

alert(new Date('11-29-2010')); //doesn't work in safari
alert(new Date('29-11-2010')); //doesn't work in safari
alert(new Date('2010-29-11')); //doesn't work in safari

编辑2018年3月22日:似乎人们仍然在这里着陆-今天,我会使用moment或date-fns,然后就不用了。Date-fns是非常痛苦的,而且很轻。


当前回答

在我的情况下,它不是格式,这是因为在我的后端Node.js模型中,我将数据库变量定义为字符串而不是日期。

我的后端节点数据库模型说:

starttime:{
  type: String,
}

而不是正确的:

 starttime:{
    type: Date,
  }

其他回答

我也有同样的问题。然后我用了moment. js .问题消失了。

当从字符串创建moment时,我们首先检查字符串是否 匹配已知的ISO 8601格式,然后返回到新的日期(字符串)如果 找不到已知格式。 警告:浏览器对解析字符串的支持不一致。因为 没有关于应该支持哪种格式、支持什么格式的规范 在某些浏览器中的工作将不能在其他浏览器中工作。 为了在解析除ISO 8601字符串以外的任何字符串时得到一致的结果, 你应该使用字符串+格式。

e.g.

var date= moment(String);

对我来说,仅仅因为Safari不能正确地执行一个新库就实现了太多,而正则表达式则是多余的。 这是一句简单的话:

console.log (new Date('2011-04-12'.replace(/-/g, "/")));

在Safari中也面临同样的问题,它通过在网页中插入这个解决了

 <script src="https://cdn.polyfill.io/v2/polyfill.min.js?features=Intl.~locale.en"></script> 

希望它也会对你的案子起作用

谢谢

我们来晚了,但在Safari和iOS中,当使用ES6反勾而不是String()进行类型转换时,我们就遇到了这个问题

这是给'无效日期'错误

const dateString = '2011-11-18';
const dateObj = new Date(`${dateString}`); 

但这是可行的

const dateObj = new Date(String(dateString)); 

我也遇到过类似的问题。Date.Parse("DATESTRING")适用于Chrome (Version 59.0.3071.115),但不适用于Safari (Version 10.1.1 (11603.2.5))

Safari:

Date.parse("2017-01-22 11:57:00")
NaN

铬:

Date.parse("2017-01-22 11:57:00")
1485115020000

对我有效的解决方案是用“T”替换dateString中的空格。(例如:dateString。(/ /g,"T"))

Safari:

Date.parse("2017-01-22T11:57:00")
1485086220000

铬:

Date.parse("2017-01-22T11:57:00")
1485115020000

注意,Safari浏览器的响应比Chrome浏览器的响应少8hrs (28800000ms),因为Safari以本地TZ返回响应(比UTC晚8hrs)

得到相同TZ的两个时间

Safari:

Date.parse("2017-01-22T11:57:00Z")
1485086220000

铬:

Date.parse("2017-01-22T11:57:00Z")
1485086220000