为什么 Stream 在设置时间戳的时候去掉了时区码?

Why does Stream remove the time zone code when setting a timestamp?

我观察到,如果您创建一个 activity 带有这样的时间戳:

2010-09-17T14:27:37.860Z

会这样存储:

2010-09-17T14:27:37.860

注意缺少的时区代码。据我所知,这违反了 ISO 标准,并且它肯定会在 JavaScript 中对 Date 对象产生并发症。我总是不得不通过添加 Z 字符将时间戳映射回正确的时间戳,这有点疯狂。

下面是一些代码,希望能说明为什么会出现这个问题:

const now = new Date('2010-09-17T14:27:37.860Z');
const notNow = new Date('2010-09-17T14:27:37.860');
console.log(now);
// Fri Sep 17 2010 09:27:37 GMT-0500 (Central Daylight Time)
console.log(notNow);
// Fri Sep 17 2010 14:27:37 GMT-0500 (Central Daylight Time)

这是怎么回事?我是不是误解了什么或者这是 Stream 的错误?

你是对的; activity.time 字段返回时没有偏移信息,即使它们被本地化为 UTC。

这是早期引入的问题,如果不破坏依赖此时间格式的现有 API 客户端数量,则无法修复。

流的 API 将 activity.time 存储为 UTC(将遵守用户输入中指定的偏移量)。如果你使用 moment.js 你可以像这样正确解析时间字符串

moment.tz("2010-09-17T14:27:37.860", "UTC")