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

use*_*181 3 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"));
Run Code Online (Sandbox Code Playgroud)

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

Invalid Date在 Safari 中返回。

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

T.J*_*der 6

我看到两个问题:

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

  2. \n
  3. 您正在将 a 传递DateDate构造函数,这会强制它将日期转换为字符串,然后解析该字符串。

  4. \n
\n\n

我只会解析一次,并在第一次调用时使用标准日期/时间格式:new Date

\n\n
import { format, formatDistance } from "date-fns";\n\nvar date = new Date("2019-03-06T00:00:00");\n// Note -----------------------^\nconsole.log(format(date, "dd MMM, y"));\n// No `new Date`   ^\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,您的字符串将被解析为本地时间(在符合规范的 JavaScript 引擎\xc2\xb9 上),因为它包含字符串的时间部分。不幸的是,在 ES2015 中添加该格式并在 ES2016 中更新后,情况发生了变化,但最终的结果是:

\n\n
\n

当 UTC 偏移表示不存在时,仅日期形式将解释为 UTC 时间,而日期时间形式将解释为本地时间。

\n
\n\n

由于您的字符串没有 UTC 偏移量(无Z+00:00类似),并且有时间,因此它会按本地时间进行解析。(同样,在符合规范的 JavaScript 引擎\xc2\xb9 上)。

\n\n

我的建议是要么不要使用内置Date对象解析日期字符串,要么确保字符串上始终有时区指示器(如果这样做)。

\n\n
\n\n

\xc2\xb9 RobG指出 Safari 解析new Date("2019-03-06T00:00:00")为 UTC。遗憾的是,这是Apple 的 JavaScript 引擎 JavaScriptCore 中的一个错误。它不仅影响 Safari,还影响 iOS 上的 Chrome(可能还影响任何其他 iOS 浏览器;我测试过 Brave、Opera 和 Dolphin),因为 Chrome 必须使用 JavaScriptCore 而不是 iOS 上通常的 V8,因为应用程序可以\不分配可执行内存,因此 JIT 引擎不能在 iOS 上使用。但 V8 团队已经制作了V8 的纯解释器版本,因此如果速度足够快,iOS 上的 Chrome(和 Brave)可能会更新以使用该版本。

\n