JavaScript Moment.js解析时区不正确

4
我有以下使用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`将其解析为正确的时区。
你有任何想法吗?

3
您的问题在于解析时区标记。请使用“ZZ”而不是“GMT-ZZ”。 - RobG
@RobG,太棒了!随便留个答案我会给你点赞和采纳的。我认为我需要 GMT-ZZ 的原因是因为文档中有这样一个例子:Offset from UTC as +-HH:mm, +-HHmm, or Z 。这真的让我困扰了很久,因为我以为它只会解析 -0400 而不是 GMT-0400。谢谢!! - Charlie Fish
1
是的,文档意味着 ZZ 代表整个时区字符串,而不仅仅是 HH:mm 部分。 :-) 我认为它将 "GMT-ZZ" 视为无效标记并忽略它。 - RobG
Moment使用方括号来转义标记,因此如果您想要明确指定,可以使用[GMT]ZZ。在解析时不是必需的,除非您打开了严格模式,但无论如何都可能希望用于格式化输出。 - Matt Johnson-Pint
1个回答

0

如评论中所述,将代码更改为以下内容即可:

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 就可以了。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接