date-fns在Safari中返回无效日期

时间:2019-04-12 15:44:59

标签: javascript date date-fns

我正在使用date-fns返回一些值,如下所示:

import { format, formatDistance } from "date-fns";

var date = new Date("2019-03-06 00:00:00");
console.log(format(new Date(date), "dd MMM, y"));

它在Chrome上运行良好,并返回We Mar, y

但是在Safari中返回Invalid Date

我相信是因为日期(“ 2019-03-06 00:00:00”)不是ISO 8601格式。但这是我从端点接收的格式。是否可以将其转换为正确的格式并使其在Safari上运行?

1 个答案:

答案 0 :(得分:1)

我看到两个问题:

  1. 您第一次解析日期时就依赖于非标准输入格式。

  2. 您要将Date传递到Date构造函数中,这迫使它将日期转换为字符串,然后解析该字符串。

我只会解析一次,并在第一次调用new Date时使用standard date/time format

import { format, formatDistance } from "date-fns";

var date = new Date("2019-03-06T00:00:00");
// Note -----------------------^
console.log(format(date, "dd MMM, y"));
// No `new Date`   ^

请注意,您的字符串将被解析为本地时间(在符合规范的JavaScript引擎上¹),因为它包含字符串的时间部分。不幸的是,在ES2015中添加了格式,在ES2016中对其进行了更新之后,这种格式有所不同,但是最终的位置是:

  

如果没有UTC偏移量表示,则仅日期格式将被解释为UTC时间,而日期时间格式将被解释为本地时间。

由于您的字符串没有UTC偏移量(没有Z+00:00或类似名称),并且确实有时间,因此将以本地时间进行解析。 (同样,在符合规范的JavaScript引擎上¹)。

我的建议是要么不使用内置的Date对象来解析日期字符串,要么确保您始终在字符串上带有时区指示符。


¹RobG指出Safari将new Date("2019-03-06T00:00:00")解析为UTC。遗憾的是,这是Apple JavaScript引擎JavaScriptCore中的a bug。它不仅会影响Safari,还会影响iOS上的Chrome(可能还会影响其他iOS浏览器;我已经测试了Brave,Opera和Dolphin),因为Chrome必须使用JavaScriptCore而不是iOS上的常规V8,因为应用无法分配可执行内存,因此JIT引擎不能在iOS上使用。但是V8团队做了interpreter-only version of V8,因此,如果速度足够快,也许iOS上的Chrome(和Brave)将被更新以使用它。