You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Unix时间戳与ISO时间转换不一致?Moment.js时间处理疑问

为什么Moment.js时间戳转换出现不一致?

这其实是时区差异在搞鬼!让我给你拆解清楚整个过程:

问题根源:Moment.js的时区默认行为

  1. 当你执行moment("01-01-2018","MM-DD-YYYY")时,Moment.js默认会用你的本地时区来解析这个日期。比如如果你的时区是UTC+5:30(印度标准时间),这个代码创建的是「本地时间2018年1月1日00:00:00」。
  2. Unix时间戳的本质是从UTC时间1970-01-01 00:00:00开始计算的秒数,所以调用.unix()时,会把本地时间转换为对应的UTC时间再计算秒数。对于UTC+5:30的时区来说,本地2018-01-01 00:00对应的UTC时间就是2017-12-31 18:30:00,这就是你得到1514745000的原因。
  3. 当你用moment.unix(1514745000).toISOString()转换时,.toISOString()方法始终输出UTC时间的ISO格式字符串,所以自然会得到2017-12-31T18:30:00.000Z,和预期不符。

解决方案:明确使用UTC时区

如果你想获取UTC时间2018年1月1日00:00对应的Unix时间戳,需要用moment.utc()来创建UTC时区的日期对象,这样就能跳过本地时区的转换:

// 创建UTC时区的2018-01-01 00:00
const utcTimestamp = moment.utc("01-01-2018","MM-DD-YYYY").unix();
// 结果是1514764800

// 反向转换验证
moment.unix(utcTimestamp).toISOString(); 
// 输出:"2018-01-01T00:00:00.000Z"

另外,如果你需要基于本地时间生成对应UTC的时间戳,也可以先创建本地时间对象,再调用.utc()方法转为UTC时区后再取秒数:

const localToUtcTimestamp = moment("01-01-2018","MM-DD-YYYY").utc().unix();

内容的提问来源于stack exchange,提问作者Suhail Gupta

火山引擎 最新活动