如何使用Moment.js将UTC时间转换为秒数(保留UTC时间)
嘿,我完全get到你的需求了——你想要获取moment.utc(new Date()).format()输出的那个UTC时间对应的Unix秒数,而不是和本地时间挂钩的戳,对吧?
先澄清一个常见误区:你之前觉得moment.utc(new Date()).unix()不符合预期,其实是对Unix时间戳的理解偏差。Unix时间戳本身就是以UTC为基准的,它代表从1970-01-01T00:00:00Z开始流逝的秒数。你例子里得到的戳转成UTC时间,其实就是你要的2020-08-19T13:xx:xxZ,转成本地夏令时才会显示15:xx:xx,这是正常的。
不过如果你想更直接地拿到对应UTC时间的秒数,这里有两种靠谱的实现方式:
方式一:用
valueOf()转毫秒再转秒valueOf()会返回当前moment对象对应的UTC基准毫秒数,除以1000取整就是秒数:const utcMoment = moment.utc(new Date()); const targetSeconds = Math.floor(utcMoment.valueOf() / 1000); // 验证:把秒数转回UTC时间,和utcMoment.format()一致 moment.utc(targetSeconds, 'X').format(); // 输出你要的UTC时间字符串方式二:正确使用
format('X')
你之前误以为format('X')不符合需求,其实它返回的就是UTC基准的秒数。只要你是基于UTC的moment对象调用它,结果就对应那个UTC时间。比如:const utcSeconds = moment.utc(new Date()).format('X'); // 同样,用moment.utc(parseInt(utcSeconds), 'X').format()验证,会得到你预期的UTC时间
另外,如果是从已知的UTC时间字符串出发,转成秒数也很简单:
const utcTimeStr = "2020-08-19T13:28:09Z"; const seconds = moment.utc(utcTimeStr).unix(); // 或者用valueOf()/1000,结果完全一致
核心点记住:只要你的moment对象是用moment.utc()创建的(确保是UTC时区),那unix()、format('X')或者valueOf()/1000得到的秒数,对应的UTC时间就是你看到的format()输出结果。之前的困惑大概率是因为你把秒数转成了本地时间来验证,而不是UTC时间~
内容的提问来源于stack exchange,提问作者xyz83242

