1

当我尝试添加日期的月份时,它正在跳过 11 月。我相信这是因为 11 月的夏令时。

下面的代码显示它比我想要的要跳一天:

var my_date = new Date(1377993599000);
console.log(my_date.toUTCString());

这将输出“2013 年 8 月 31 日星期六 23:59:59 GMT”

my_date.setUTCMonth(my_date.getUTCMonth() + 3);
console.log(my_date.toUTCString());

这将输出“Sun, 01 Dec 2013 23:59:59 GMT”

现在,当我尝试仅添加 2 时:

my_date.setUTCMonth(my_date.getUTCMonth() + 2);
console.log(my_date.toUTCString());

这将输出“2013 年 10 月 31 日星期四 23:59:59 GMT”

当我尝试将日期设置为零时:

my_date.setUTCMonth(my_date.getUTCMonth() + 3, 0);
console.log(my_date.toUTCString());

这将输出“2013 年 10 月 31 日星期四 23:59:59 GMT”

有谁知道解决这个问题的干净技巧?

我是否最好放弃 UTC 功能并简单地从所有时间中删除时区偏移量?如果我这样做了,它真的能解决我的问题吗?

4

2 回答 2

4

没有 11 月 31 日,因此当您在月份中添加 3 时,它别无选择,只能滚动到下个月,即 12 月 1 日。

可靠地向前推进几个月的问题是棘手的。您可以在执行此操作之前将日期 ( .setDate()) 设置为 1,但随后您必须决定如何将其设置回与原始日期相关的内容。

于 2013-08-01T21:28:03.997 回答
2

Pointy 的回答是正确的,这是一个允许不均匀月份的函数:

/* Given a date object, add months (may be +ve or -ve)
** Allow for uneven length months, e.g.
**
**   30 Jan 2013 + 1 month => 30 Feb => 2 Mar
**
** so make 28 Feb. Also works for subtraction
**/
function addMonths(date, months){
  // Copy date, avoid IE bug for early dates
  var d = new Date(date.getTime());
  months = Number(months);
  d.setMonth(d.getMonth() + months);
  var check = d.getMonth() - date.getMonth() + months;

  // If rolled over to next month, go to last day of previous month
  if (check) {
    d.setDate(0); 
  }
  return d;
}
于 2013-08-01T22:29:52.197 回答