我正试图形成一个日期,这是3个月前的当前日期。我通过下面的代码得到当前月份

var currentDate = new Date();
var currentMonth = currentDate.getMonth()+1;

你能给我提供一个逻辑来计算和形成一个日期(date数据类型的对象),考虑到当月份是一月(1)时,日期前3个月将是十月(10)吗?


当前回答

如果gilly3提供的setMonth方法不是你想要的,可以考虑:

var someDate = new Date(); // add arguments as needed
someDate.setTime(someDate.getTime() - 3*28*24*60*60);
// assumes the definition of "one month" to be "four weeks".

可以使用任何数量的时间,只要设置正确的倍数。

其他回答

为了让事情变得简单,你可以使用DateJS,一个JavaScript的日期库:

http://www.datejs.com/

示例代码:

Date.today().add({ months: -1 });
var d = new Date();
d.setMonth(d.getMonth() - 3);

这适用于一月份。运行这段代码:

var d =新日期(2012年1月14日); 游戏机。d . toLocaleDateString log (()); d.setMonth(d.getMonth) - 3; 游戏机。d . toLocaleDateString log (());


这里有一些警告……

一个月是一个奇怪的东西。你如何定义1个月?30天吗?大多数人会说,一个月前是指需要引用的前一个月的同一天。但超过一半的时间,是31天前,而不是30天前。如果今天是这个月的31号(而不是8月或12月),那么这个月的这一天在前一个月是不存在的。

有趣的是,如果你问谷歌哪个月比哪个月早,它会同意JavaScript的说法:

它还说一个月有30.4167天:

那么,3月31日之前的一个月和3月28日之前的一个月是同一天吗?这完全取决于你对“一个月前”的定义。去和你的产品负责人谈谈。

如果你想像momentjs那样做,并通过移动到本月的最后一天来纠正这些错误,你可以这样做:

const d =新的日期(“2019年3月31日”); console.log (d.toLocaleDateString ()); const month = d.getMonth(); d.setMonth(d.getMonth() - 1); while (d.getMonth() === month) { d.setDate(d.getDate() - 1); } console.log (d.toLocaleDateString ());

如果您的需求比这更复杂,请使用一些数学并编写一些代码。你是一个开发人员!你不需要安装一个库!你不需要从stackoverflow复制和粘贴!您可以自己开发代码来完成您所需要的工作!

var d = new Date(); 文档。写(d + "<br/>"); d.setMonth(d.getMonth() - 6); document . write (d);

这是最小和最简单的代码。

   var minDate = new Date(); 
   minDate.setMonth(minDate.getMonth() - 3);

声明具有当前日期的变量。 然后通过使用setMonth内置函数,我们可以得到3个月后的日期。

由于“2月31日”自动转换为“3月3日”或“3月2日”,作为“3月31日”的前一个月,这是相当违反直觉的,我决定按照我的想法来做。 类似于@Don Kirkby的回答,我也将日期修改为目标月份的最后一天。

function nMonthsAgo(date, n) {
  // get the target year, month, date
  const y = date.getFullYear() - Math.trunc(n / 12) 
  const m = date.getMonth() - n % 12
  let d = date.getDate()
  if (d > 27) {   // get a valid date
    const lastDateofMonth = new Date(y, m + 1, 0).getDate()
    d = Math.min(d, lastDateofMonth) 
  }
  return new Date(y, m, d) 
}

d = new Date('2022-03-31')
nMonthsAgo(d, 1).toLocaleDateString()

最后,我喜欢@gilly3在他的回答中说的:

如果您的需求比这更复杂,请使用一些数学并编写一些代码。你是一个开发人员!你不需要安装一个库!你不需要从stackoverflow复制和粘贴!您可以自己开发代码来完成您所需要的工作!