Angularjs日期过滤器和时刻js返回年份';1970年&x27年;设置年份格式时

Angularjs日期过滤器和时刻js返回年份';1970年&x27年;设置年份格式时,angularjs,momentjs,Angularjs,Momentjs,我有一个从服务器获取的对象,这个对象有一个属性:obj.year:“2017”,例如。该属性是一个编号。 我只需要显示年份的最后两位数字。 当我将其格式化为HTML时,如下所示: {{obj.year | date : 'yy'}} 它显示:70。我尝试了各种内置的角度年过滤器,并尝试了矩js格式化功能: function formatYear(year) { return moment(year).format('YY'); } 但它仍然返回1970年。 我不明白为什么它今

我有一个从服务器获取的对象,这个对象有一个属性:
obj.year:“2017”
,例如。该属性是一个
编号
。 我只需要显示年份的最后两位数字。 当我将其格式化为HTML时,如下所示:

{{obj.year | date : 'yy'}}
它显示:
70
。我尝试了各种内置的角度年过滤器,并尝试了
矩js
格式化功能:

  function formatYear(year) {
    return moment(year).format('YY');
  }
但它仍然返回1970年。 我不明白为什么它今年会返回,而这只会在格式化时发生?如果我没有对其应用任何格式,它将返回对象的正常值-2017

过滤器的文档解释了发生这种情况的原因。它期望您提供的值是
Date
对象、日期字符串或以毫秒为单位的数字

以下是他们的描述:

将日期格式化为日期对象、毫秒(字符串或数字)或各种ISO 8601日期时间字符串格式(例如yyyy-MM-ddTHH:MM:ss.sssZ及其较短版本,如yyyy-MM-ddTHH:mmZ、yyyy-MM-dd或YYYYYYMMDDHMMSSZ)。如果字符串输入中未指定时区,则该时间被视为在本地时区中

您获得1970年的原因是b/c
日期
过滤器将您的2017年解释为自纪元或之后的毫秒数

要使
日期
过滤器工作,您只需将年份值转换为
日期
(或使用矩时的类似方法):


{{obj.year | date:'yy'}
输出
70
的原因是您将编号
2017
传递给angular的
date
过滤器,这样做相当于
新日期(2017年)
返回的日期和时间为
2017
毫秒,从
1970-01-01 00:00:00:000
或准确地说
1970-01-01 00:00:02:017
。因此,当您使用
yy
格式字符串运行angular的
date
过滤器时,您会得到年份的最后两位数,当然是
70

要提供替代解决方案,您可以使用angular的过滤器:


正如其他答案所述,您得到的是
70
而不是
17
,因为角度过滤器接受:

日期对象、毫秒(字符串或数字)或各种ISO 8601日期时间字符串

因此,您的输入被解释为自1970年1月1日00:00:00以来的毫秒数,基本上相当于:


console.log(新日期(2017));//1970-01-01T00:00:02.017Z
momentJs接受完整日期作为字符串或时间戳。例如:时刻('2016-08-20')。格式('YY');矩(newdate().getTime()).format('YY');谢谢,我喜欢你的解释,我认为它很容易理解,对其他人也很有用。谢谢,你的建议实际上解决了我的问题。在我看来,文档有点不清楚,首先我认为后端以错误的格式向我传递数据。
var date = new Date(obj.year, 0,1); // Jan 1
{{ obj.year | limitTo : 2 : 2 }}