1

我正在尝试从 GMT0(或 UTC)计算的以毫秒为单位的时间创建一个 Javascript 日期对象。

我在 2013 年使用以下代码(可在此处验证):

var t = new Date(Date.UTC(0, 0, 0, 0, 0, 0, 0));
t.setMilliseconds(1383447600000);

但是当我调用以下命令时:

alert(t.getFullYear());
alert(t.getUTCFullYear());

我得到的是 1943 年……而不是 2013 年!

为什么?以及如何解决这个问题?谢谢!

JsFiddle 是:http: //jsfiddle.net/EVf72/

4

3 回答 3

4

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

于 2013-08-02T18:00:33.480 回答
1

它正在发生,因为它Date.UTC(0, 0, 0, 0, 0, 0, 0)是一个很大的负数。这会让你回到过去。当您调用setMilliseconds()语义时,您正在更新该过去时间的毫秒值。那个时间向前滚动,但它仍然是 70 年前,因为你开始的时间很远很远。

Date 实例上的.setTime()API 强制将整个日期设置为提供的时间戳值,完全覆盖以前的值。

于 2013-08-02T18:03:22.597 回答
0

Date.UTC(year,month,day,hours,minutes,seconds,millisec) 根据通用时间返回自 1970 年 1 月 1 日午夜以来日期字符串中的毫秒数。您需要为 Date.UTC(2013, 1, 1, ...) 填写所需的日期。

于 2013-08-02T18:07:54.893 回答