Angular 13中使用Moment.js转换日期时年份显示错误
问题分析与解决方案
你遇到的年份显示错误,核心原因是时间戳单位的处理逻辑不合理,同时需要先明确时间戳对应的真实日期:
关键背景
Moment.js对时间戳的处理规则是:
moment(timestamp)接收毫秒级时间戳(13位数字)moment.unix(timestamp)接收秒级时间戳(10位数字)
你的代码中通过Number.isInteger(value)判断是否使用moment.unix的逻辑完全错误:
- 若传入字符串类型的毫秒数(如
"1672828478537"),会被误判为非整数,执行moment.unix导致时间被放大1000倍,年份严重偏差; - 若传入数字类型的秒级时间戳(如
1641464478),会被当成毫秒处理,得到的时间远早于预期; - 你给出的例子
1672828478537是13位毫秒级时间戳,代码直接用moment(value)处理是正确的,该时间戳对应的真实日期就是2023年1月6日。如果你认为正确结果是2022年1月6日,说明你传入的时间戳本身有误,对应2022年1月6日的毫秒时间戳应为1641465600000左右。
修改后的管道代码
优化时间戳处理逻辑,根据位数自动判断单位,避免混淆:
transform(value: any, pattern: string = 'short'): any { // 处理ISO格式日期字符串 if (typeof value === 'string' && value.includes('-')) { return moment(value).locale(this.translateService.currentLang).format('L LTS'); } // 统一转换为数字类型,无效值直接返回 const timestamp = Number(value); if (isNaN(timestamp)) { return value; } // 根据位数判断时间戳单位:10位为秒,13位为毫秒 if (timestamp.toString().length === 10) { return moment.unix(timestamp).locale(this.translateService.currentLang).format('L LTS'); } else { return moment(timestamp).locale(this.translateService.currentLang).format('L LTS'); } }
验证时间戳
你可以在浏览器控制台执行以下代码,确认时间戳对应的真实日期:
// 验证你的示例时间戳 new Date(1672828478537); // 输出:Fri Jan 06 2023 12:14:38 GMT+0800 (中国标准时间) // 验证2022年1月6日的时间戳 new Date(1641465600000); // 输出:Thu Jan 06 2022 00:00:00 GMT+0800 (中国标准时间)
内容的提问来源于stack exchange,提问作者Ael9643
相关产品推荐
相关产品推荐

