Node.js中(new Date()).toJSON()返回错误时间及时区的问题
解决Node.js中
toJSON()返回UTC时间而非本地时区时间的问题 嘿,这个问题我之前也踩过坑!其实toJSON()方法的设计就是默认返回UTC时区的ISO 8601格式字符串(带Z后缀表示UTC),而直接打印Date对象时,JS会自动输出本地时区的时间表示,所以才会出现你看到的两种不同结果。下面给你几个实用的解决办法:
方法1:手动构建本地时区的ISO格式字符串
因为toJSON()本质上调用了toISOString(),这两个方法都会返回UTC时间。如果想要得到和本地时区一致的ISO格式字符串,可以自己提取Date对象的本地时间属性来拼接:
function getLocalISOString(date = new Date()) { // 提取本地时间的各个部分 const year = date.getFullYear(); const month = String(date.getMonth() + 1).padStart(2, '0'); const day = String(date.getDate()).padStart(2, '0'); const hours = String(date.getHours()).padStart(2, '0'); const minutes = String(date.getMinutes()).padStart(2, '0'); const seconds = String(date.getSeconds()).padStart(2, '0'); const milliseconds = String(date.getMilliseconds()).padStart(3, '0'); // 计算本地时区偏移(分钟转成小时:分钟格式) const timeZoneOffset = -date.getTimezoneOffset(); const offsetSign = timeZoneOffset >= 0 ? '+' : '-'; const offsetHours = String(Math.floor(Math.abs(timeZoneOffset) / 60)).padStart(2, '0'); const offsetMinutes = String(Math.abs(timeZoneOffset) % 60).padStart(2, '0'); // 拼接成本地时区的ISO格式字符串 return `${year}-${month}-${day}T${hours}:${minutes}:${seconds}.${milliseconds}${offsetSign}${offsetHours}:${offsetMinutes}`; } // 使用示例 console.log(getLocalISOString()); // 输出类似 2018-01-03T14:47:12.773+03:30 的结果
方法2:用toLocaleString系列方法定制本地时间输出
如果不需要严格的ISO格式,只是想要易读的本地时间(包含时区信息),可以用toLocaleString或toLocaleDateTimeString,还能自定义格式和语言:
const date = new Date(); // 定制输出格式,包含毫秒和完整时区名称 const localTimeStr = date.toLocaleString('en-US', { year: 'numeric', month: '2-digit', day: '2-digit', hour: '2-digit', minute: '2-digit', second: '2-digit', fractionalSecondDigits: 3, timeZoneName: 'long' }); console.log(localTimeStr); // 输出类似 "01/03/2018, 14:47:12.773 Iran Standard Time"
额外提醒:UTC时间的适用场景
顺便说一句,如果是用于数据存储或跨时区传输,其实toJSON()返回的UTC时间是更推荐的选择——因为不同时区的客户端可以统一将UTC时间转换为各自的本地时间展示,避免时区混乱。只有在需要直接给用户展示本地时间时,再转成本地时区格式就好。
内容的提问来源于stack exchange,提问作者Sepehr
相关产品推荐
相关产品推荐

