有没有办法在单个语句中为日期对象设置日期和月份?

Is there a way to set date and month on a date object in a single statement?

我正在尝试通过添加特定时间段来计算基于另一个日期的日期。比方说,如果我想将 3 个月添加到一个日期,那么新日期应该是 3 个月后日期的前一天。以这个例子为例,下面是我最接近实现我想做的事情的代码:

new Date(
    date
        .setMonth(date.getMonth() + 3)
        .setDate(date.getDate() - 1)
)

但是这个 returns 错误:TypeError: date.setMonth(...).setDate 不是一个函数。我认为方法链不起作用,所以我可能必须在下一条语句中设置日期。有没有办法在一条代码语句中做到这一点?

你可以这样

newDate = new Date(newDate.getFullYear(), newDate.getMonth() + 3, endDate.getDate() -1)

您可以扩展 Date Object 并创建您自己的可链接的方法。

class MyDate extends Date {
  constructor() {
    super(...arguments)
  }
  
  changeMonth(amount) {
    return new MyDate(this.setMonth(this.getMonth() + amount));
  }
  
  changeDate(amount) {
    return new MyDate(this.setDate(this.getDate() + amount));
  }
};

const date = new MyDate();

console.log("Original:", date);
console.log("Changed :", date.changeMonth(3).changeDate(-5));

Is there a way to set date and month on a date object in a single statement?

是的。以下将月份设置为一月,将日期设置为一个语句的第一天:

let d = new Date();
d.setMonth(0, 1);

…if I want to add 3 months to a date, then the new date should be one day before the date after 3 months

不,您不能在一个语句中执行此操作,因为添加一个月需要考虑该月的天数。例如。 2020 年 1 月 31 日加上一个月,结果是 2 月 31 日,由于 2020 年 2 月只有 29 天,因此日期设置为 2020 年 3 月 2 日。同样,将 1 个月添加到 5 月 31 日得到 6 月 31 日,滚动到 7 月 1 日。因此您需要先添加月份(请参阅Adding months to a Date in JavaScript), then subtract one day (see Add days to JavaScript Date).

原来有一个非常简单的解决方案。 setMonth() 方法允许我们传递一个可选的 dayValue 参数 (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setMonth)。使用它,代码简单地变成:

new Date(
    date.setMonth(
        date.getMonth() + 3,
        date.getDate() - 1
    )
)