【问题标题】:Javascript Date.getFullYear() returns 1943 instead of 2013, why?Javascript Date.getFullYear() 返回 1943 而不是 2013,为什么?
【发布时间】:2013-08-04 02:21:21
【问题描述】:

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

我在 2013 年使用以下代码(作为可验证的here):

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/

【问题讨论】:

    标签: javascript date gmt milliseconds


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-11-02
          • 2015-11-02
          • 2021-09-13
          • 2017-06-30
          • 1970-01-01
          • 2012-11-19
          相关资源
          最近更新 更多