如何使用moment将用户输入的GMT日期时间转换为UTC timestamp?
嘿,这个问题我熟!用moment.js完全可以轻松搞定,我给你一步步拆解怎么实现:
首先,核心要点是明确指定输入时间的时区(你提到是GMT),不然moment会默认用当前运行环境的本地时区,结果就会出错。下面用你给的例子(13-Mar-2018、上午8:45 GMT)来演示两种靠谱的实现方式:
方法一:解析日期字符串+设置时分+指定时区
这种方法适合用户输入的是日期字符串的场景,直接用moment解析后补充分时,再绑定GMT时区:
// 模拟用户输入的参数 const inputDateStr = "13-Mar-2018"; const hours = 8; const minutes = 45; // 1. 解析日期字符串,设置时分,指定时区为GMT const gmtMoment = moment(inputDateStr, "DD-MMM-YYYY") .set({ hour: hours, minute: minutes }) .tz("GMT"); // 2. 转换为UTC时间戳(毫秒级用valueOf(),秒级用unix()) const utcTimestampMs = gmtMoment.valueOf(); const utcTimestampSec = gmtMoment.unix(); console.log(utcTimestampMs); // 输出:1520925900000 console.log(utcTimestampSec); // 输出:1520925900
方法二:直接构建UTC时间对象
如果你已经把日期拆解成了年、月、日(注意moment的月份是0-based,3月对应2),可以直接用moment.utc()构建:
// 拆解后的日期参数:2018年3月13日(月份2)、8点45分 const utcMoment = moment.utc([2018, 2, 13, hours, minutes]); // 获取时间戳 const timestamp = utcMoment.valueOf(); // 同样得到1520925900000
关键注意事项
- 时区一定要明确:因为你输入的时间是GMT,所以必须用
.tz("GMT")或者moment.utc()来锁定时区,否则如果你的本地时区不是GMT,转换结果会偏差。 - 日期格式匹配:解析字符串时,
"DD-MMM-YYYY"要和输入的"13-Mar-2018"完全对应,如果输入格式变了(比如"2018-03-13"),要同步修改格式字符串。 - 时间戳单位:
valueOf()返回毫秒级时间戳,unix()返回秒级,根据你的需求选择就行。
对了,你例子里的8:45 GMT其实和UTC时间是完全一致的(GMT和UTC在实际使用中几乎没有时差),所以转换后的时间戳就是这个时间点对应的UTC毫秒数,你可以用moment.utc("2018-03-13T08:45:00Z").valueOf()验证结果,是完全一样的。
内容的提问来源于stack exchange,提问作者Mateen-Hussain
相关产品推荐
相关产品推荐

