javascript - date-fns 在 safari 上返回无效日期
问题描述
我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
但Invalid Date
在 Safari 中返回。
我相信这是因为日期(“2019-03-06 00:00:00”)不是 ISO 8601 格式。但这是我从端点收到的格式。是否有任何选项可以将其转换为正确的格式并使其在 Safari 上运行?
解决方案
我看到两个问题:
第一次解析日期时,您依赖的是非标准输入格式。
您将 a 传递给
Date
构造Date
函数,这会强制它将日期转换为字符串,然后解析字符串。
我只会解析一次,并在第一次调用时使用标准的日期/时间格式new Date
:
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中的一个错误。它不仅影响 Safari,还影响 iOS 上的 Chrome(可能还有任何其他 iOS 浏览器;我测试过 Brave、Opera 和 Dolphin),因为 Chrome 必须在 iOS 上使用 JavaScriptCore 而不是其通常的 V8,因为应用程序不能分配可执行内存,因此无法在 iOS 上使用 JIT 引擎。但是 V8 团队已经制作了 V8的仅解释器版本,因此如果速度足够快,iOS 上的 Chrome(和 Brave)可能会更新以使用它。
推荐阅读
- python - 为什么自动评分器给我 CodeHS 8.4.9: Owls Part 2 的错误?
- c# - 有没有更简单的方法来写这个;类示例
其中 T1:T3 ? - javascript - 还记得 jQuery 弹出模式的关闭状态,localStorage 是最简单的方法吗?如果是,如何?
- c++ - FFMPEG 库 - 将原始图像转码为 h264 流,输出文件不包含 pts 和 dts 信息
- java - 从 Android 中的 cer 证书获取公钥哈希
- r - 按站点数据将带有物种的小标题转换为 vegan::diversity() 的数字矩阵
- python - 我的 EVAL 代码 discord.py 中的问题...(我的 eval 代码不起作用)
- spring-boot - ModelMapping SpringBoot 匹配多个源属性层次结构
- lotus-notes - HTTP Web 服务器:代理未在配置的时间限制内完成
- kivy - 概括 KivyMD 图像列表示例