【问题标题】:Why does using Date.UTC() return a completely different month value compared to Date()?为什么使用 Date.UTC() 与 Date() 相比返回完全不同的月份值?
【发布时间】:2019-02-04 20:57:30
【问题描述】:

我最近一直在与 Dates 合作一个项目,并注意到一些我认为没有意义的奇怪事情(或者,至少对我来说没有意义)。

在javascript中,你可以创建一个新的日期,默认情况下,如果你得到月份,它会返回当前月份的数字减一。

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

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

(假设下面sn-p中的dt与上面sn-p中的当前时间相同)

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.UTC()Date() 相比返回完全不同的月份值?

我知道 UTC 和浏览器时间通常不一样,但肯定不会在一个月之内结束吗?

【问题讨论】:

  • 因为你有dt.getMonth()+1,所以月份是从零开始的
  • “你加一个以获得正确的月份”如果你得到一个0-11个月,是什么让你认为构造函数需要一个1 -12?
  • dt.getMonth() 返回一个从零开始的数字(对于八月,它返回 7),因此您将结果加一以显示正确的月份(即 8)。但是,utc_dt.getMonth() 似乎在做一些不同的事情,因为它不是从零开始的

标签: javascript node.js date


【解决方案1】:

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

UTC 月份因当地时区偏移量在该月最后一天/第一天的午夜任一侧而有所不同。因此,如果今天是本地的 8 月 31 日,那么您加 1,您要求的是 9 月 31 日,即滚动到 10 月 1 日。

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

【讨论】:

  • 对!这实际上是有道理的。
【解决方案2】:

取自this page

使用的参数:

[…]

  • 月:指定整数 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

【讨论】:

  • 是的,这是有道理的。但是为什么在 Date.UTC dt.getMonth 中添加 +1 会使值改变 2?
  • @TheBalmyOne 它没有!您可能会在代码中假设错误的值。在这个单独的示例中,将 1 添加到月份参数会得到 8,而不是 9。
  • 在 dt 上运行 getMonth 返回 7,这是正确的,像您在帖子中那样运行 utc_dt getMonth 返回 7,这是正确的,但是在初始化 utc_dt 时执行 'dt.getMonth+1' 时,然后运行 getMonth,它返回 9(参见:i.gyazo.com/e5bafe87929dee9a42065f3a65c746e6.png
  • 我也做了同样的事情,结果我得到了 8 个。 (Chrome 版本 68.0.3440.106)
  • 奇怪,我使用的是相同的 chrome 版本 (68.0.3440.106),但我得到了不同的结果......好吧,很酷......我可能只是重新安装 chrome 看看会发生什么。 +1 谢谢
猜你喜欢
  • 1970-01-01
  • 2012-07-20
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 2016-02-16
  • 1970-01-01
  • 1970-01-01
  • 2011-11-15
相关资源
最近更新 更多