MomentJS 设置时区而不改变时间

MomentJS set timezone without changing time

我正在尝试为 moment.js 中的日期设置时区而不更改时间值

我得到一个 utc 日期:

date.toString() // Sun Sep 27 2015 00:00:00 GMT+0000

而且我需要在不更改时间的情况下设置时区。

Sun Sep 27 2015 00:00:00 GMT-0500

如果我使用 date.utcOffset(moment().utcOffset()) 它会添加偏移量:

date.toString() // Sat Sep 26 2015 19:00:00 GMT-0500

我可以

date = moment(date.format("YYYYMMDDHHmmssSSSS"), "YYYYMMDDHHmmssSSSS")

但这似乎是一种低效的方法。

有什么方法可以只改变时区而不改变时间吗?

moment().utcOffset(0).add(moment().utcOffset(), 'minutes').format()

您必须做一些数学运算,如果不进行概要分析,就无法说出哪个最有效。

javascript 日期对象将始终具有本地时区,因此您需要在 moment 对象中工作或进行补偿。

在撰写本文时(时刻 2.22),您可以使用 someLocalMomentVariable.utc(true) 从本地转到 UTC,然后使用 someUtcMomentVariable.local(true).

从 UTC 返回到本地

如果您使用 moment.js,请使用 utcOffset 并将 true 作为第二个参数。

date2 = moment(date1).utcOffset('+0400', true)

或者如果您正在使用 moment-timezone,您可以在 moment 对象上使用 tz 函数,第二个参数为 true

date1 = moment(date1).tz('Asia/Kolkata', true)

使用时刻时区,如果您可以识别时区,您也可以通过传递 true 标志

来设置它而无需调整时间
const tz = "America/New_York"; // GMT-0500
moment(date).tz(tz, true); // true flag identifies not changing time when updating time zone

文档(虽然它没有解释 boolean 标志) Converting to Zone