问题描述
我返回了一组 ISO8601 日期及其偏移量。
我想向用户显示根据该偏移量计算的小时数,而不是本地偏移量。不幸的是,我没有时区,以便使用 Intl
界面。
一个例子。想象一下,我在 etc/GMT+4 上。如果我被退回:
2019-05-30T07:00:00.000+01:00
07:00:00
不是:
10:00
解决方法
不求助于图书馆的最佳选择是:
const input = "2019-05-30T07:00:00.000+01:00";
const localTime = input.substring(11,19); // assuming you want to truncate milliseconds
console.log(localTime);
原因是在使用Date
对象解析诸如字符串时,应用偏移信息,但随后将其丢弃。换句话说,以下所有内容都是等价的:
new Date("2019-05-30T07:00:00.000+01:00")
new Date("2019-05-30T06:00:00.000Z")
new Date(1559196000000)
实际存储在 Date
对象中的唯一内容是值 1559196000000
。因此,在创建 Date
对象后,无论对其进行多少操作都不能保证返回本地小时数,因为它最初以 UTC+1 偏移量显示。
像 Luxon 和 Moment 这样的库通过在单独的内部字段中保留偏移量和/或原始字符串来处理这个问题。 Date
对象没有这样的字段。
在不久的将来,JavaScript 将能够使用 Temporal 提出的对象和函数在本机处理此问题。目前,您可以手动解析字符串或使用库。