AngularJS插值语法中如何将时间戳转换为日期格式?
在AngularJS里直接把时间戳转成日期格式的解决办法
当然可以实现啦!不过你当前的写法没生效,大概率是踩了几个常见的小坑,咱们一步步来捋清楚:
首先得确保Moment.js能被AngularJS识别
AngularJS默认不认全局的moment对象,你得先把它整合到AngularJS的生态里,有两种简单的方式:
方法1:手动把moment注册成AngularJS常量
在你的模块代码里加这么一段:
angular.module('你的应用模块名') .constant('moment', window.moment);
注册完之后,不管是控制器里注入还是模板里直接用,AngularJS都能找到moment了。
方法2:用专门的angular-moment封装库
这是更省心的选择,引入angular-moment的脚本后,在模块里添加依赖:
angular.module('你的应用模块名', ['angularMoment']);
它自带了适配AngularJS的过滤器,用起来更顺手。
正确的模板写法(两种可选)
写法1:直接用moment(已注册常量的前提下)
先确认$ctrl.myTimestamp是有效的时间戳数值,如果是字符串类型的话记得转成数字,然后模板里这么写:
{{ moment(Number($ctrl.myTimestamp)).format('MMMM Do YYYY, h:mm:ss a') }}
哦对了!如果你的时间戳是秒级的(比如你举的1519357500),得乘以1000转成毫秒,因为moment默认吃毫秒级时间戳:
{{ moment($ctrl.myTimestamp * 1000).format('MMMM Do YYYY, h:mm:ss a') }}
写法2:用angular-moment的过滤器(推荐)
用过滤器的话代码更简洁,还自动处理类型和时间戳单位的问题:
- 处理秒级时间戳:先过
amFromUnix过滤器,再用amDateFormat格式化
{{ $ctrl.myTimestamp | amFromUnix | amDateFormat:'MMMM Do YYYY, h:mm:ss a' }}
- 如果是毫秒级时间戳,直接用
amDateFormat就行:
{{ $ctrl.myTimestamp | amDateFormat:'MMMM Do YYYY, h:mm:ss a' }}
最后排查几个常见坑
- 打开浏览器控制台看看有没有报错,比如
moment is not defined——这说明你没正确引入moment或者没注册成AngularJS的服务; - 确认
$ctrl.myTimestamp不是undefined或者null,可以先在模板里打印{{ $ctrl.myTimestamp }}看看值对不对; - 区分秒级和毫秒级时间戳,这个是最容易踩的坑!
举个完整的小例子:
控制器代码:
angular.module('myDemoApp', ['angularMoment']) .controller('DemoCtrl', function() { this.myTimestamp = 1519357500; // 这是秒级时间戳 });
模板代码:
<div ng-controller="DemoCtrl as $ctrl"> 转换后的日期:{{ $ctrl.myTimestamp | amFromUnix | amDateFormat:'MMMM Do YYYY, h:mm:ss a' }} </div>
运行后就能正确显示成 February 23rd 2018, 12:45:00 pm 啦!
内容的提问来源于stack exchange,提问作者dadsa
相关产品推荐
相关产品推荐

