【问题标题】:JavaScript Moment.js Parsing Timezone IncorrectlyJavaScript Moment.js 不正确地解析时区
【发布时间】:2019-03-19 09:28:17
【问题描述】:

我有以下使用 Moment.js 的 JavaScript 代码。

const time = "Thu Nov 01 2018 00:00:00 GMT-0400";
const momentTime = moment(time, "ddd MMM DD YYYY HH:mm:ss GMT-ZZ");
console.log(momentTime.toString()); // Thu Nov 01 2018 00:00:00 GMT-0600
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

问题是我希望以下值彼此相等(它们目前不是):

  • time (Thu Nov 01 2018 00:00:00 GMT-0400)
  • momentTime.toString() (Thu Nov 01 2018 00:00:00 GMT-0600)

我希望 momentTime.toString() 等于 Wed Oct 31 2018 22:00:00 GMT-0600(如果我的数学计算正确的话)。

看起来它只是出于某种原因错误地解析了该时区或 GMT 偏移量。

根据Moment.js parsing documentation,我应该可以使用ZZ 将其解析为正确的时区。

知道我在这里做错了什么吗?

【问题讨论】:

  • 您的问题是解析时的时区令牌。用“ZZ”代替“GMT-ZZ”。
  • @RobG 成功了!随时留下答案,我会投票并接受。我认为我需要GMT-ZZ 的原因是因为在文档中它以Offset from UTC as +-HH:mm, +-HHmm, or Z 为例。真的把我绊倒了,因为我认为它只会解析-0400 而不是GMT-0400。谢谢!!
  • 是的,文档意味着 ZZ 代表整个时区字符串,而不仅仅是 HH:mm 部分。 :-) 我认为它将“GMT-ZZ”视为无效令牌并忽略它。
  • Moment 使用方括号来转义标记,所以如果你想明确一点,可以使用[GMT]ZZ。除非您打开严格模式,否则解析不是必需的,但可能需要以任何一种方式格式化输出。

标签: javascript date time timezone momentjs


【解决方案1】:

正如 cmets 中提到的,将代码更改为以下有效:

const time = "Thu Nov 01 2018 00:00:00 GMT-0400";
const momentTime = moment(time, "ddd MMM DD YYYY HH:mm:ss ZZ");
console.log(momentTime.toString()); // Wed Oct 31 2018 22:00:00 GMT-0600
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.2/moment.min.js"></script>

所以基本上将格式字符串中的GMT-ZZ 更改为ZZ 有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多