我有一个从服务器获取的对象,并且该对象具有属性:obj.year: "2017"
,例如。该属性为number
。
我只需要显示年份的最后两位数字。
当我在HTML中格式化它时:
{{obj.year | date : 'yy'}}
它显示:70
。我尝试了所有类型的Angular年过滤器,并尝试使用moment js
格式化函数:
function formatYear(year) {
return moment(year).format('YY');
}
但它仍然会回归 1970年。 我不明白为什么它会在今年返回,而这只有在格式化时才会发生?如果我不对其应用任何格式,则返回对象的正常值 - 2017
答案 0 :(得分:2)
date过滤器的文档解释了为什么会发生这种情况。它期望您提供的值是Date
对象,日期字符串或以毫秒为单位的数字。
以下是他们的描述:
格式化为Date对象,毫秒(字符串或数字)或各种ISO 8601日期时间字符串格式的日期(例如yyyy-MM-ddTHH:mm:ss.sssZ及其较短版本,如yyyy-MM-ddTHH:mmZ, yyyy-MM-dd或yyyyMMddTHHmmssZ)。如果字符串输入中未指定时区,则认为时间在本地时区。
您获得1970年的原因是b / c date
过滤器占用了您的年份,2017年,并将其解释为自纪元或unix time以来的毫秒数。
要使date
过滤器正常工作,您只需将年份值转换为Date
(或使用时刻时的类似方法):
var date = new Date(obj.year, 0,1); // Jan 1
答案 1 :(得分:1)
{{obj.year | date : 'yy'}}
输出70
的原因是您将数字2017
传递给角度date
过滤器,因此执行相当于new Date(2017)
的返回日期和时间距离2017
1970-01-01 00:00:00:000
毫秒或精确1970-01-01 00:00:02:017
date
毫秒。因此,当您使用带有yy
格式字符串的angular 70
过滤器运行该过滤器时,您将获得当年的最后两位数,当然是{{ obj.year | limitTo : 2 : 2 }}
。
要提供替代解决方案,您可以使用angular limiTo
过滤器:
background-image: url("image.jpg");
background-attachment: fixed;
background-position: center;
background-repeat: no-repeat;
background-size: cover;
答案 2 :(得分:1)
正如其他答案所述,您收到70
而不是17
,因为有角度date
过滤器接受:
日期对象,毫秒(字符串或数字)或各种ISO 8601日期时间字符串
因此,您的输入被解释为自1 January 1970 00:00:00
以来的毫秒数,基本上相当于:
console.log(new Date(2017)); // 1970-01-01T00:00:02.017Z

你的formatYear
函数使用时刻具有相同的逻辑,因此它会产生相同的错误结果。如果您使用时刻解析指定格式(moment(String, String);
而不是moment(Number);
),您的输入将被视为字符串,您将获得正确的输出:
function formatYearBad(year) {
// uses moment(Number)
return moment(year).format('YY');
}
function formatYearOk(year) {
// uses moment(String, String)
return moment(year, 'YYYY').format('YY');
}
console.log( formatYearBad(2017) ); // 70
console.log( formatYearOk(2017) ); // 17

<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
&#13;
要在angularjs视图中使用正确的时刻逻辑,您必须使用angular-moment库。您可以使用amParse
指定输入字符串的格式(在您的情况下为四位数年份)和amDateFormat
以指定输出格式(在您的情况下为两位数年份)。这是一个有效的例子:
angular.module('MyApp',['angularMoment'])
.controller('AppCtrl', function($scope) {
$scope.obj = {
year: "2017"
};
});
&#13;
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.5.9/angular.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/moment.js/2.17.1/moment.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/angular-moment/1.0.1/angular-moment.min.js"></script>
<div ng-app="MyApp" ng-controller="AppCtrl">
{{obj.year | amParse:'YYYY' | amDateFormat:'YY'}}
</div>
&#13;