如何在以午夜 00 点为中心的 javascript 中向 UTC 时间戳添加 3 个月?

How to add 3 months to a UTC time stamp in javascript centered at midnight 00 Hours?

我想在 javascript 中将今天的日期加上 3 个月。这是我的代码:

    var now = new Date();
    now.setHours(0, 0, 0, 0);;
    now.setMinutes(0);

    var plus3mo = new Date();
    plus3mo.setMonth((now.getMonth() + 3));
    plus3mo.setHours(0, 0, 0, 0);
    plus3mo.setMinutes(0);

    var utc_timestamp_today = Date.UTC(now.getFullYear(), now.getMonth(), now.getDate(), 0, 0, 0, 0);
    var utc_timestamp_3moFromNow = Date.UTC(plus3mo.getFullYear(), plus3mo.getMonth(), plus3mo.getDate(), 0, 0, 0, 0);

我想在今天的日期上加上 3 个月,然后得到时间。它正在这样做,但要注意的是我需要将时间设置为恰好 00 点或凌晨 12 点。我的代码得到了奇怪的结果。

这是我在调试和使用此 UTC time stamp converter site 时查看的结果。

1441929600000  --> 09/10/2015 20:00:00     ("Today's Date")
1449792000000  --> 12/10/2015 19:00:00     ("3 Months From Now")

如您所见,我添加了 3 个月,但时间集中在晚上 8 点和晚上 7 点。为什么会这样?

在 JS 中使用日期操作总是给你一个相对于浏览器本地时间的日期。所以使用

var now = new Date();
now.setHours(0, 0, 0, 0);
now.setMinutes(0);

将为您提供一个 now 中的日期,该日期是您当地时间的午夜,但在您当地相对于 UTC 的时区偏移。 (我假设当前是 +4 小时,然后更改为 +5 小时)当冬季夏令时开始时。

为了获得每个日期的午夜 UTC,我建议:

  1. 使用 getTime/valueOf
  2. 从每个日期获取 UTC 日期时间戳
  3. 使用 getTimezoneOffset
  4. 确定偏移量
  5. 将偏移量从分钟转换为毫秒(乘以 60000)并从原始时间戳中减去
  6. 如果您需要原始语言环境中的日期对象但在午夜 UTC
  7. ,请对每个日期对象使用 setTime