使用AngularJS date过滤器处理日期字符串返回错误月份问题
问题原因
AngularJS的date过滤器对输入值有严格的类型要求,仅支持原生Date对象、毫秒级时间戳数字、符合ISO 8601规范的完整日期字符串三类输入。
你截取得到的两位字符串"04"传入过滤器后,会被识别为数值4,当成4毫秒的时间戳计算,对应时间为1970年1月1日00:00:00.004,输出月份自然固定为Jan,和你预期的4月没有关联。
解决方法
这里提供两种可直接落地的修正方案:
- 方案1:视图内直接转换格式
先把接口返回的定长日期字符串拼接为ISO标准格式,再调用date过滤器输出目标格式,不需要修改控制器逻辑:{{ (item.default['Date modified'].replace(/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/, '$1-$2-$3T$4:$5:$6')) | date:'MMM YYYY' }} - 方案2:控制器预定义月份映射(性能更优)
如果项目中频繁用到月份简写转换,可以在控制器中预定义映射数组,视图直接取值即可,避免过滤器的运行开销:
控制器代码:
视图代码:// 按顺序对应1-12月的简写 $scope.monthShortList = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];{{ monthShortList[+item.default['Date modified'].substr(4,2) - 1] }} {{ item.default['Date modified'].substr(0,4) }}
内容的提问来源于stack exchange,提问作者CMartins
相关产品推荐
相关产品推荐

