简短答案:使用setTime
而不是setMilliseconds
。
长答案:
问题是您的开始日期不正确。的值1383447600000
是自纪元0
(1970 年 1 月 1 日 00:00:00 UTC)以来的秒数,但您的开始日期不是纪元 0!相反,它是年份1899
:
> var t = new Date(Date.UTC(0, 0, 0, 0, 0, 0, 0));
> console.log(t.getFullYear());
1899
然后,当您使用setMilliseconds
并提供范围 over999
时,它会将值转换为适当的年、天、小时、秒和毫秒数,并将其添加到当前日期。
1383447600000
相当于43岁多一点。因此,您基本上是在告诉 JavaScript 将 43 年多一点添加到 1899 年,即 1943 年。
从文档中setMilliseconds
:
如果您指定的数字超出预期范围,则 Date 对象中的日期信息会相应更新。例如,如果您指定 1005,则秒数增加 1,而 5 用于毫秒。
如果您改为提供正确的起点以Date.UTC
使其与 epoch 匹配0
,您将收到正确的答案:
> var t = new Date(Date.UTC(1970, 0, 0, 0, 0, 0, 0)); //First param is year
> t.setMilliseconds(1383447600000);
> console.log(t.getFullYear());
2013
但是,您可以简单地使用setTime
:
> var t = new Date();
> t.setTime(1383447600000);
> console.log(t.getFullYear());
2013
回顾一下,以下在功能上是等效的:
> var t = new Date(Date.UTC(1970, 0, 0, 0, 0, 0, 0)); //First param is year
> t.setMilliseconds(1383447600000);
> console.log(t.getFullYear());
2013
和
> var t = new Date();
> t.setTime(1383447600000);
> console.log(t.getFullYear());
2013
但是,如果您要处理自 epoch 以来的毫秒数0
,则需要使用setTime
,或者如果要使用 ,请确保实际上从 epoch 开始0
(使用Date.UTC
)setMilliseconds
。