gpt4 book ai didi

javascript - momentJs 解析日期 : Unexpected behaviour

转载 作者:行者123 更新时间:2023-11-30 12:14:08 25 4
gpt4 key购买 nike

使用 momentJs 我遇到了一些我不明白的事情;让我们尝试一个特定的日期,例如 2099-11-11T15:00

将时刻转换为日期:

> moment('2099-11-11T15:00').toDate()  
// => Wed Nov 11 2099 15:00:00 GMT+0100 (CET)

将日期转换为时刻:

> var d = new Date('2099-11-11T15:00')  
// => undefined
> moment(d)
// => { ... _d: Wed Nov 11 2099 16:00:00 GMT+0100 (CET) }

我们有不同的日期,第一个是星期三 15:00,第二个是星期三 16:00。事实上,如果我们比较它们:

moment(d).isSame(moment('2099-11-11T15:00'))
// => false

乍一看,我认为它与 toDate() 方法有关,但事实并非如此;让我们输入以下内容:

new Date('2099-11-11T15:00').toISOString()
'2099-11-11T15:00:00.000Z'
moment('2099-11-11T15:00').toISOString()
'2099-11-11T14:00:00.000Z'

这是怎么回事?

最佳答案

一些事情:

  • 不要关注_d字段。带下划线的字段是 moment 的 API 内部的,可能并不总是您所期望的。在许多函数中,它必须结合其他 内部字段(例如_offset)进行评估,才能产生有效的输出。相反,请使用各种公共(public)函数,例如 formattoDate.valueOf 等。

  • 认识到 Date 构造函数解析字符串的方式与 moment 的解析函数的工作方式之间存在许多差异。不要指望它们会匹配。

  • 当字符串不包含任何时区信息时,moment(...) 将始终将其视为本地时区,而 moment.utc(...) 会将其视为 UTC。 (您的回答就是一个很好的例子。)

  • Date 构造函数被赋予字符串时,字符串的格式会显着影响解释。实际行为可能因实现而异,但大多数当前浏览器会将连字符和 T 视为字符串采用 ISO8601 格式的指示。然而,如果没有任何尾随 Z 或偏移量,ES5 规范表示将它们解释为 UTC。这在 ES6 中有所改变,它将把这些情况视为本地时间 - 以更好地符合 ISO8601 规范。由于尚不清楚各种环境何时开始实现此更改,因此最好不要依赖 Date 构造函数。

  • 如果您希望Date 构造函数将您的值解释为本地 时间(使用 ES5),一种方法是使用字符串替换来删除 T 并将连字符 (-) 替换为斜杠 (/)。这适用于大多数环境,尽管没有关于此的规范。 (有人告诉我它在某些 Safari 浏览器中会失败。)实际上,我只会使用 Moment 的解析函数,而根本不依赖 Date 构造函数。

关于javascript - momentJs 解析日期 : Unexpected behaviour,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32890705/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com