JavaScript 终于从 Go 那里“抄”来了新的日期和时间函数

陪她去流浪 桃子 阅读次数:291

刚刚看到一条推特1说火狐最先支持2了“Temporal”。由于我是火狐的长期用户,并且以前一直被教育说“火狐对标准的支持一般比Chrome慢几年”,所以我就仔细看了一眼,看看这到底是个什么情况。

等等,“Temporal”是个啥单词、啥意思?没见过。噢,继续看了才知道:原来是一个全新的、用来替换 Date 的标准。意为“时间的”。看起来这些人是真的很能选新词汇啊,以前在C++里面第一次看到“std::chrono”3的时候也是这种感觉。

我很早就吐槽过 JavaScript 中的 Date 真是极其难用。比如:

  1. 过于简陋,内部只是一个 int64 表示毫秒/纳秒;
  2. 格式化过于复杂:《W3C 总是能给我整出恶心的东西,为什么把一个 Date 赋值给 [代码...》;
  3. 不支持时区,不能按时区格式化。为此我还特意把时间发送给后端来格式化为指定的时区对应的时间4
  4. 也为此,我还实现了自己的带时区的日期时间:scripts/header.js#L68-L95

标题说“从 Go 那里‘抄’来了”没有依据,仅仅是我个人的推断5

  1. 看到了 Duration / Now 等类型/函数;
  2. Duration 包含 add() / subtract() 等方法;
  3. Instant 包含 add() / subtract() / since() / until() 等方法;
  4. ZonedDateTime 表示带时区的日期时间。这个会非常有用。

对于时区,JavaScript 和 Go 都建议使用“时区的名字”而不是“时区的偏移”6

除时区外,Temporal 还有看起来比 Go 的 Time 远远复杂的多种日历系统支持。

太好了,赶紧的!