我正在使用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上运行?
答案 0 :(得分:1)
我看到两个问题:
您第一次解析日期时就依赖于非标准输入格式。
您要将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)将被更新以使用它。