简答:使用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 并提供超过 999 的范围时,它会将值转换为适当的年数、天数、小时数、秒数和毫秒数,并将其添加到当前日期。
1383447600000 相当于 43 岁多一点。因此,您基本上是在告诉 JavaScript 将 43 年多一点添加到 1899 年,即 1943 年。
来自setMilliseconds的文档:
如果您指定的数字超出预期范围,则 Date 对象中的日期信息会相应更新。例如,如果您指定 1005,则秒数增加 1,毫秒使用 5。
如果您改为向Date.UTC 提供正确的起点,使其与纪元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
但是,如果您要处理自纪元 0 以来的毫秒数,则需要使用 setTime,或者如果要使用,请确保实际上以纪元 0 开始(使用 Date.UTC) setMilliseconds.