在javascript中显示包含其ISO8601偏移量的小时数

问题描述

我返回了一组 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 偏移量显示。

LuxonMoment 这样的库通过在单独的内部字段中保留偏移量和/或原始字符串来处理这个问题。 Date 对象没有这样的字段。

在不久的将来,JavaScript 将能够使用 Temporal 提出的对象和函数在本机处理此问题。目前,您可以手动解析字符串或使用库。