JavaScript(React)中Unix时间戳转本地时间结果不准确如何解决
问题根因
转换结果偏差由两个代码错误共同导致:
- 时间戳单位处理错误:Unix时间戳分秒级(10位长度)、毫秒级(13位长度)两种,你传入的参数
1657745369979.82本身已经是毫秒级时间戳,对应2022年的时间点。原代码无差别对入参乘1000,相当于把时间值放大1000倍,直接把时间点偏移到了54501年,才会出现离谱的年份结果。 - 日期格式化API参数传错:
toLocaleString的第一个参数需要传入BCP 47规范的语言区域标签(比如en-US代表美式英文日期格式),原代码传入的是d.getDate()的返回值(也就是当月日期数值,属于非法参数),导致格式化逻辑异常,输出格式不符合预期。
修复代码
先对入参做单位判断,秒级时间戳才做乘1000转毫秒的处理,毫秒级时间戳直接使用;同时给toLocaleString传入正确的区域参数,匹配你需要的月/日/年、12小时制带时分秒的输出格式:
function convertDate(unixDate) { // 自动适配秒/毫秒级时间戳,先取整避免小数影响长度判断 const msTime = String(Math.floor(unixDate)).length === 10 ? unixDate * 1000 : unixDate; const d = new Date(msTime); // 按美式日期格式输出,开启12小时制 return d.toLocaleString('en-US', { hour12: true }); }
传入1657745369979.82调用上述函数,会返回7/13/2022, 8:49:29 PM,和预期结果一致。如果需要月份、日期不足两位时补前导零(比如把7月显示为07),可以自定义格式化逻辑补零,或者给toLocaleString传入更细的格式配置项。
内容的提问来源于stack exchange,提问作者Baslki
相关产品推荐
相关产品推荐

