为什么使用Date.UTC()返回与Date()完全不同的月份值?

时间:2018-08-30 01:41:27

标签: javascript node.js date

我最近一直在与Dates合作开发一个项目,并且发现了一些我认为不合理的东西(或者,至少对我来说这没有意义)。

在javascript中,您可以创建一个新日期,默认情况下,如果您获得月份,它将返回当前月份号减一。

let dt = new Date();//Assume 30/8/2018
dt.getMonth();// returns 7

您还可以使用现有日期创建一个新日期以从UTC运行,并且由于javascript的 .getMonth() Dates方法始终返回月份号减一,因此您可以添加一个来获取正确的月份...但是, Date.UTC(...)返回下个月而不是当前/正确的月份

(假设以下代码段中的 dt 与当前时间段中的上述代码段相同)

let utc_dt = new Date(//Assume 30/8/2018
    Date.UTC(
        dt.getFullYear(),
        dt.getMonth()+1,
        dt.getDate(),
        dt.getHours(),
        dt.getMinutes(),
        dt.getSeconds()
    )
);
utc_dt.getMonth();// returns 9

为什么与 Date()相比,使用 Date.UTC()返回的月份值完全不同?

我了解UTC和浏览器的时间通常并不相同,但是肯定不会在一个月之内消失吗?

2 个答案:

答案 0 :(得分:1)

除+1之外,dt.getMonth()还根据系统设置返回本地月份,而Date.UTC会将第二个参数解释为 UTC月份 >。

UTC月在当地时区的时间段有所不同,该时间在该月的最后一天/第一天的午夜两边。因此,如果今天是当地时间8月31日,那么您加1,就要求9月31日到10月1日。

同样,时区偏移意味着这种影响会在时区偏移的时间内扩展,因此似乎发生在不合逻辑的时间。

答案 1 :(得分:0)

取自this page

  

使用的参数:

     

[…]

     
      
  • month:指定整数   在0到11之间代表月份。
  •   
     

[…]

这意味着,您只需传递一个介于0到11之间的值,其中0表示一月,11表示十二月:

let dt = new Date(); //Assume 30/8/2018
console.info(dt.getMonth()); // returns 7

let utc_dt = new Date( //Assume 30/8/2018
  Date.UTC(
    dt.getFullYear(),
    dt.getMonth(),
    dt.getDate(),
    dt.getHours(),
    dt.getMinutes(),
    dt.getSeconds()
  )
);
console.info(utc_dt.getMonth()); // returns 7