如何不使用第三方库获取指定时区下自定义日期的毫秒时间戳
原生JS实现指定时区日期转时间戳方案
核心实现逻辑
无需引入任何第三方库,直接利用JS原生Intl.DateTimeFormat内置的IANA时区数据库支持实现,核心思路是将用户选中的日期转换为目标时区(Europe/Moscow)对应0点的UTC时间,再输出时间戳。
完整实现代码
function getMoscowDateTimestamp(inputDateStr) { // 入参支持YYYY-MM-DD、YYYY-MM-DDTHH:mm:ss格式,默认取日期段的0点计算 const inputDate = new Date(inputDateStr); const inputYear = inputDate.getFullYear(); const inputMonth = inputDate.getMonth(); const inputDay = inputDate.getDate(); // 配置莫斯科时区格式化工具 const moscowFormatter = new Intl.DateTimeFormat('en-US', { timeZone: 'Europe/Moscow', year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', hour12: false }); // 以输入日期的UTC 0点为基准,格式化得到莫斯科时区对应的时间分段 const utcBase = new Date(Date.UTC(inputYear, inputMonth, inputDay, 0, 0, 0)); const formatParts = moscowFormatter.formatToParts(utcBase); const timeMap = {}; formatParts.forEach(({type, value}) => { timeMap[type] = parseInt(value, 10) }) // 构造莫斯科时区对应时间的UTC时间戳 const targetTime = new Date(Date.UTC( timeMap.year, timeMap.month - 1, timeMap.day, timeMap.hour, timeMap.minute, timeMap.second )) // 返回毫秒级时间戳,需要秒级的话直接除以1000取整即可 return targetTime.getTime() }
使用示例
// 测试用例:选中2021年11月8日 const result = getMoscowDateTimestamp('2021-11-08') // 输出结果完全等效于 moment.tz('2021-11-08T00:00:00', 'Europe/Moscow').valueOf() console.log(result)
该实现兼容所有现代浏览器(Chrome 24+、Firefox 52+、Safari 10+、Edge 12+)以及Node.js 13+版本,以上环境均原生支持Europe/Moscow这类IANA标准时区标识,无需额外依赖。
内容的提问来源于stack exchange,提问作者DenimTornado
相关产品推荐
相关产品推荐

