如何在今天前三个月用JavaScript计算日期?

Kee*_*ser 133 javascript date

我试图在当前日期之前3个月形成一个日期.我通过以下代码获得当前月份

var currentDate = new Date();
var currentMonth = currentDate.getMonth()+1;
Run Code Online (Sandbox Code Playgroud)

Date考虑到月份是1月(1),日期前3个月将是OCtober(10),你们能为我提供计算和形成日期(数据类型的对象)的逻辑吗?

gil*_*ly3 289

var d = new Date();
d.setMonth(d.getMonth() - 3);
Run Code Online (Sandbox Code Playgroud)

这适用于一月.运行此代码段:

var d = new Date("January 14, 2012");
console.log(d.toLocaleDateString());
d.setMonth(d.getMonth() - 3);
console.log(d.toLocaleDateString());
Run Code Online (Sandbox Code Playgroud)

  • 我知道这已经过时了,但是如果日期是3月31日,你使用这种方法减去一个月的结果就是3月2日.https://jsfiddle.net/atamata/rvumf7dg/ (7认同)
  • @AlexG - 如果您不熟悉JavaScript日期解析,那么我可以看到我的快速示例如何令人困惑.JavaScript将月份表示为零,其中1月为零.为了避免这种混淆,特别是因为这与问题或我的答案无关,我已经更新了我的演示以从字符串中获取日期,这应该更直观. (3认同)

Jan*_*sch 22

我建议使用名为Moment.js的库.

它经过了充分测试,跨浏览器和服务器端工作(我在Angular和Node项目中都使用它).它对语言环境日期有很大的支持.

http://momentjs.com/

var threeMonthsAgo = moment().subtract(3, 'months');

console.log(threeMonthsAgo.format()); // 2015-10-13T09:37:35+02:00
Run Code Online (Sandbox Code Playgroud)

.format()返回以ISO 8601格式格式化的日期的字符串表示形式.您也可以使用自定义日期格式,如下所示:.format('dddd, MMMM Do YYYY, h:mm:ss a')

  • 快进到未来,您可能[不想再使用 Moment.js](https://momentjs.com/docs/#/-project-status/)。 (8认同)

thi*_*ode 8

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

http://www.datejs.com/

您的示例代码:

Date.today().add({ months: -1 });
Run Code Online (Sandbox Code Playgroud)

  • 立即使用moment.js (2认同)

小智 8

这应该处理加法/减法,只需将一个负值放入减去,然后加一个正值.这也解决了月交叉问题.

function monthAdd(date, month) {
    var temp = date;
    temp = new Date(date.getFullYear(), date.getMonth(), 1);
    temp.setMonth(temp.getMonth() + (month + 1));
    temp.setDate(temp.getDate() - 1); 

    if (date.getDate() < temp.getDate()) { 
        temp.setDate(date.getDate()); 
    }

    return temp;    
}
Run Code Online (Sandbox Code Playgroud)


Aus*_*tin 8

做这个

 let currentdate = new Date();
 let last3months = new Date(currentdate.setMonth(currentdate.getMonth()-3));
Run Code Online (Sandbox Code Playgroud)

Javascript 的setMonth方法也处理年份。例如,2020-01-29如果 currentDate 设置为,上面的代码将返回new Date("2020-01-29")


Don*_*kby 7

我喜欢gilly3的简单回答,但用户可能会感到惊讶,3月31日之前的一个月是3月3日。我选择实现一个坚持到月底的版本,所以3月28日、29日、30日之前的一个月, 31 都是 2 月 28 日,当时不是闰年。

function addMonths(date, months) {
  var result = new Date(date),
      expectedMonth = ((date.getMonth() + months) % 12 + 12) % 12;
  result.setMonth(result.getMonth() + months);
  if (result.getMonth() !== expectedMonth) {
    result.setDate(0);
  }
  return result;
}

var dt2004_05_31 = new Date("2004-05-31 0:00"),
    dt2001_05_31 = new Date("2001-05-31 0:00"),
    dt2001_03_31 = new Date("2001-03-31 0:00"),
    dt2001_02_28 = new Date("2001-02-28 0:00"),
    result = addMonths(dt2001_05_31, -2);
console.assert(dt2001_03_31.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2001_05_31, -3);
console.assert(dt2001_02_28.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2001_05_31, 36);
console.assert(dt2004_05_31.getTime() == result.getTime(), result.toDateString());

result = addMonths(dt2004_05_31, -38);
console.assert(dt2001_03_31.getTime() == result.getTime(), result.toDateString());

console.log('Done.');
Run Code Online (Sandbox Code Playgroud)


小智 7

直接放入变量中的“一个衬里”(在多行中易于阅读):

var oneMonthAgo = new Date(
    new Date().getFullYear(),
    new Date().getMonth() - 1, 
    new Date().getDate()
);
Run Code Online (Sandbox Code Playgroud)


Nie*_*sol 6

如果setMonthgilly3 提供的方法不是您要找的方法,请考虑:

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".
Run Code Online (Sandbox Code Playgroud)

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

  • 在这种情况下,您确实会得到 3 月 3 日(2011 年),因为这就是宽松模式下的 2 月 31 日。但减去 _2 个月_,您将得到 1 月 31 日。在每月 28 天的模型下,您就不会得到这一天。尽管“Date”类很弱,尽管 Date.js 更受欢迎,但它至少模拟了一个足够适合休闲使用的宽松的预知日历。 (2认同)

小智 6

对于获取今天之前三个月的日期:

let d = new Date(new Date().setMonth(new Date().getMonth() - 3))
console.log(d.toISOString().slice(0, 10))
// 2022-05-24 (today is 2022-08-24)
Run Code Online (Sandbox Code Playgroud)