时刻 .js 不采用 UTC 时区

moment.js not taking UTC timezone

提问人:geekynoob 提问时间:9/28/2023 最后编辑:geekynoob 更新时间:9/29/2023 访问量:59

问:

我正在使用 moment.js 将时间转换为不同的时区,但即使在指定它之后,它所花费的时间也不会被视为 UTC。

moment.utc(dateMillis).tz(timezone).format(dateFormat);

在这里,moment.utc(dateMillis) 应该将 dateMillis 视为 UTC,但事实并非如此。当我将“GMT”传递给 .tz(timezone) 时,它会将日期转换为 date-5:30,这意味着 dateMillis 是在 IST 时区拍摄的。(我在 IST 时区),如果有人在其他时区打开该页面然后切换到 UTC,也会发生同样的事情,它将执行 -TZ。

我希望时刻始终将 dateMillis 视为 UTC,然后我想转换为所需的时区。

添加示例:

format = 'YYYY/MM/DD HH:mm:ss (Z)'
DateMillis = Date.parse(data)

什么时候

data = 2020-05-15 15:33:39
dateMillis = 1589537019000
timezone = 'GMT'

转换为 GMT,这意味着值没有变化给我 -5:30 的结果。

result: 2020/05/15 10:03:39 (+00:00)
datetime momentjs 时刻时区

评论


答:

0赞 Matt Johnson-Pint 9/29/2023 #1

调用 时,将传递一个解释为本地时间的字符串。换言之,由于您的本地时区是 IST (UTC+05:30),因此等价于 .Date.parseDate.parse('2020-05-15 15:33:39')Date.parse('2020-05-15T15:33:39+05:30')

相应的 UTC 时间确实是 ,具有您提供的 Unix 时间戳。2020-05-15T10:03:39Z1589537019000

即使没有 Moment,您也可以看到这一点:

const t1 = Date.parse('2020-05-15 15:33:39');
const t2 = Date.parse('2020-05-15T15:33:39+05:30');
const t3 = Date.parse('2020-05-15T10:03:39Z');
console.log('t1', t1);
console.log('t2', t2);
console.log('t3', t3);
console.log('t1 === t2', t1 === t2); // true only if you're in IST
console.log('t2 === t3', t2 === t3); // always true

Moment也在做正确的事情。但是,您有一些冗余代码。您可以删除调用 - 仅使用 UTC 和本地时间时不需要时刻时区。tz

moment.utc(dateMillis).format(dateFormat);

这将在 UTC 模式下创建一个 Moment 对象,给定 提供的 Unix 时间戳。然后,它以所需格式发出一个字符串 - 以 UTC 表示,因为 Moment 对象处于 UTC 模式。(请注意,Unix 时间戳始终以 UTC 为单位。dateMillis

因此,问题的根源是您最初是根据本地时间解释输入字符串。如果您真正想要的是以 UTC 来解释输入字符串,那么您可以改为执行以下操作:

moment.utc(data).format(dateFormat)

或者,如果您只想在不使用 Moment 的情况下获取时间戳......

Date.parse(data.replace(' ', 'T') + 'Z')

另请注意,不再建议将 Moment 用于新项目

评论

0赞 geekynoob 10/5/2023
感谢马特提供详细的解决方案。我想出了摆脱的解决方案。我通过使用Date.parsemoment.tz.setDefault('GMT');parsedDate = moment(parseInt(data));
0赞 Matt Johnson-Pint 10/5/2023
假设您的数据是数字时间戳,则使用 .如果您不使用 UTC 和本地以外的时区,则不需要时刻时区的开销。moment.utc(parseInt(data))