简短答案:使用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。