时刻时区格式不会返回预期结果

时间:2017-10-16 12:24:36

标签: timezone momentjs utc datetime-conversion

使用moment-timezone中的tz()功能,如下所示:

moment.tz('2017-10-15 13:53:43','Asia/Hong_Kong').format()
//returns '2017-10-15T13:53:43+08:00'

moment.tz('2017-10-15 13:53:43','Asia/Hong_Kong').format('h:m A')
//I expect to return '9:53 PM' but it returns '1:53 PM'

最终,我想应用fromNow()函数来格式化结果。但是当我应用它时,它使用初始时间戳并忽略应用的时区。

moment.tz('2017-10-15 13:53:43','Asia/Hong_Kong').fromNow()
//I expect to return '1 min ago' when actual time is 13:54 UTC (21:54 in HK) but it returns '8 hours ago'

我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

当你这样做时:

moment.tz('2017-10-15 13:53:43','Asia/Hong_Kong');

您创建了一个日期/时间,对应于 2017年10月15日 th ,香港时间下午1点53分 - 这反过来对应到2017-10-15T05:53:43Z UTC上午5:53 )。

调用format()函数时:

moment.tz('2017-10-15 13:53:43','Asia/Hong_Kong').format();

它返回:

  

2017-10-15T13:53:43 + 08:00

+08:00部分只是UTC offset - 它只是告诉Hong Kong is 8 hours ahead UTC。但2017-10-15T13:53:43+08:00香港时间下午1:53 )与2017-10-15T05:53:43Z完全相同(上午5:53 UTC )。这就是为什么fromNow(),当前时间 13:54 UTC 时,会返回8小时。

如果您想要与UTC中 1:53 PM 对应的日期/时间,则应使用utc()函数:

// October 15th 2017, 1:53 PM in UTC
moment.utc('2017-10-15 13:53:43');

现在,当当前时间 13:54 UTC 时,fromNow()将返回1分钟(因为日期/时间代表 UTC下午1:53 )。

要将此转换为香港时区,只需使用tz()功能:

// convert 1:53 PM UTC to Hong Kong timezone (9:53 PM)
moment.utc('2017-10-15 13:53:43').tz('Asia/Hong_Kong').format('h:m A');

这会将 1:53 PM UTC 转换为香港时区(导致 9:53 PM ):