You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 20:35:15