当格式化一年时,角度日期过滤器和时刻js返回'1970'年

时间:2017-02-23 16:49:28

标签: angularjs momentjs

我有一个从服务器获取的对象,并且该对象具有属性:obj.year: "2017",例如。该属性为number。 我只需要显示年份的最后两位数字。 当我在HTML中格式化它时:

{{obj.year | date : 'yy'}}

它显示:70。我尝试了所有类型的Angular年过滤器,并尝试使用moment js格式化函数:

  function formatYear(year) {
    return moment(year).format('YY');
  }

但它仍然会回归 1970年。 我不明白为什么它会在今年返回,而这只有在格式化时才会发生?如果我不对其应用任何格式,则返回对象的正常值 - 2017

3 个答案:

答案 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;
&#13;
&#13;

要在angularjs视图中使用正确的时刻逻辑,您必须使用angular-moment库。您可以使用amParse指定输入字符串的格式(在您的情况下为四位数年份)和amDateFormat以指定输出格式(在您的情况下为两位数年份)。这是一个有效的例子:

&#13;
&#13;
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;
&#13;
&#13;