moment timezone js returns 错误的日期时间

moment timezone js returns wrong datetime

我正在使用 Moment Timezone 获取 Asia/Tokyo 时区的当前日期时间。

代码如下

var currentDateTime = new Date(moment().tz('Asia/Tokyo').format('YYYY-MM-DDTHH:mm:ss'))

假设我当地时区的当前日期时间如下

Thu Jul 22 2021 19:49:47 GMT+0700 (Indochina Time)

我预计 Asia/Tokyo 时区的当前日期如下

Thu Jul 22 2021 21:49:47 GMT+0700 (Indochina Time)

在 Chrome 中,我得到了预期的日期时间。 但是在我的 iPhone 上的 Safari 中,我得到了错误的日期时间。

Fri Jul 23 2021 04:49:47 GMT+0700 (Indochina Time)

返回的当前日期时间似乎是正确的当前日期时间加上 7 小时。

这是我的环境

iPhone : iPhone 6

iOS : 12.5.4

您遇到的问题是由 Date 构造函数根据本地时区(在 Chrome 中)和 UTC(在 Safari 中?)解析时间引起的。

对于给定的时间,此代码

moment().tz('Asia/Tokyo').format('YYYY-MM-DDTHH:mm:ss')

returns

"2021-07-22T21:49:47"

然后将这个时间传递给 Date 构造函数:

var currentDateTime = new Date("2021-07-22T21:49:47")

因为这个字符串没有时区信息,它被假定在设备的本地时区 (Chrome) 或 UTC (Safari),这给出了错误的日期对象。

虽然您可以将时区注入此字符串 (using ZZ),但您可以使用以下方法从 moment 对象构建日期对象:

var currentDateTime = moment().tz('Asia/Tokyo').toDate()

但这实际上与

相同
var currentDateTime = new Date()

如果预期输出是以下格式的字符串:

"Thu Jul 22 2021 21:49:47 GMT+0900 (Japan Standard Time)"

最接近的是:

moment().tz('Asia/Tokyo').format('ddd MMM D YYYY, h:mm:ss a [GMT]ZZ (z)')
// Thu Jul 22 2021 21:49:47 GMT+0900 (JST)

或者,还有本地化的“月份名称、月份日期、星期几、年份、时间”格式:

moment().tz('Asia/Tokyo').format('llll (z)')
// In my locale, I get:
// Thu, Jul 22, 2021 9:49 PM (JST)

查看 Moment display format documentation 以获得更多选项。