有没有一种方法可以在单个语句中为日期对象设置日期和月份?

时间:2020-09-28 09:42:02

标签: javascript date method-chaining

我正在尝试通过添加特定时间段来基于另一个日期来计算日期。假设我要在日期上加上3个月,那么新日期应该是3个月后的日期的前一天。以该示例为例,以下是我最接近实现我想做的事情的代码:

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

但这将返回错误:TypeError:date.setMonth(...)。setDate不是函数。我认为方法链不起作用,因此我可能必须在下一条语句中使用setDate。有没有办法在单个代码语句中做到这一点?

4 个答案:

答案 0 :(得分:0)

您可以这样

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

答案 1 :(得分:0)

您可以扩展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));

答案 2 :(得分:0)

是否可以在单个语句中为日期对象设置日期和月份?

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

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

…如果我想在日期上添加3个月,则新日期应为3个月后的日期的前一天

不,您不能在一个语句中这样做,因为添加一个月需要考虑该月中的天数。例如。将2020年1月31日的结果增加一个月 2月31日,并且由于2020年2月只有29天,因此日期设置为2020年3月2日。类似地,将5月31日加1个月将得出6月31日,这将延续到7月1日。因此,您需要先添加几个月(请参见Adding months to a Date in JavaScript),然后减去一天(请参阅Add days to JavaScript Date)。

答案 3 :(得分:0)

结果是有一个非常简单的解决方案。使用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
    )
)