使用moment.unix()转换日期后,date管道格式化结果不符合预期
问题分析与解决方案
咱们来拆解你遇到的两个核心问题,一步步解决:
1. Angular date 管道无法识别 Moment 对象
Angular 的 date 管道只认原生 Date 对象、数字型毫秒时间戳或者 ISO 8601 字符串,但你传入的是一个 Moment 实例对象。当管道接收到无法解析的对象时,会默认调用它的 toString() 方法——这就是你看到 Fri Feb 23 2018 00:50:00 GMT+0200 这种完整格式的原因,这正是 Moment 对象 toString() 的默认输出。
2. 时间戳单位的小误区(验证说明)
你提到这是个「毫秒值」1519347000,但这个数字是10位的,通常毫秒级时间戳是13位(比如 1519347000000)。实际上 1519347000 是秒级 Unix 时间戳,你用 moment.unix(1519347000) 是完全正确的——这个方法专门处理秒级戳,会自动转成毫秒供 Moment 内部使用,这部分没出错,对应的时间确实是你要的 Feb 23, 2018 00:50(GMT+02 时区)。
两种可行解决办法
方法一:直接用 Moment 自身的格式化能力
既然已经用了 Moment,直接用它的 format() 方法更省心,不用依赖 Angular 的管道:
// 在组件里预先处理好格式化后的字符串 this.formattedDate = moment.unix(1519347000).format('MMM D, YYYY hh:mm');
然后模板里直接插值:
{{ formattedDate }}
这样就能直接得到你想要的 Feb 23, 2018 00:50。
方法二:把 Moment 对象转成管道能识别的类型
如果非要用 Angular 的 date 管道,需要先把 Moment 对象转成管道支持的格式:
- 转成原生 Date 对象:
moment.unix(1519347000).toDate() - 转成毫秒数:
moment.unix(1519347000).valueOf()
模板里这样写:
<!-- 转成 Date 对象后用管道 --> {{ obj.myDate.toDate() | date:'MMM d, y hh:mm' }} <!-- 或者转成毫秒数后用管道 --> {{ obj.myDate.valueOf() | date:'MMM d, y hh:mm' }}
小贴士:Angular 的 date 管道会跟着应用的时区设置走,如果你需要和 Moment 保持一致的时区处理,记得统一两者的时区配置哦。
内容的提问来源于stack exchange,提问作者Leo Messi
相关产品推荐
相关产品推荐

