从JavaScript的当前日期获取上个月的第一个日期

31 javascript

请任何人共享代码,以便在JavaScript中查找上个月的当前日期的第一个日期.例如,如果当前日期是2009年1月25日,那么我应该将2008年12月1日作为结果.

ann*_*ata 65

直截了当,使用日期方法:

  var x = new Date();
  x.setDate(1);
  x.setMonth(x.getMonth()-1);
Run Code Online (Sandbox Code Playgroud)

  • 另外,你应该写x.setMonth(x.getMonth() - 1); 否则你将得到一个未定义的引用 (7认同)
  • 当一天变成31岁时,这种情况不起作用,就像2014-07-31那样 (3认同)
  • 不,它会自动调整日期 (2认同)
  • 不幸的是,在晚期JavaScript版本中不推荐使用'with'关键字:(来源:http://stackoverflow.com/questions/61552/are-there-legitimate-uses-for-javascripts-with-statement (2认同)

Rez*_*ani 22

最简单的方法是:

var x = new Date();
x.setDate(0); // 0 will result in the last day of the previous month
x.setDate(1); // 1 will result in the first day of the month
Run Code Online (Sandbox Code Playgroud)

  • 我在 SO 上看到的最被低估的答案。 (4认同)
  • 这适用于我测试过的所有情况:常规日期,一个月的 31 日,闰年 2 月的 28 日,1 月 1 日(回滚到上一年的 12 月)。它只是有效,应该是公认的答案。疯狂的是,这个问题是在 2009 年提出的。 (2认同)
  • 只是为了向任何不理解该方法的人澄清,这是有效的,因为“x.setDate(0)”将日期设置为上个月的最后一天,并且由于当您执行“x.setDate”时,日期现在引用上个月(1)` 它为您提供该月的第一天。非常好的解决方案。 (2认同)

ale*_*emb 8

setMonth()重要提示:这里使用的一些答案是错误的:

2019 年使用的 1 个liner(使用 ES6 语法;所有主要浏览器和 Node 均支持):

    const date = new Date().toISOString(); // "2019-09-18T13:49:12.775Z"
    const [yyyy, mm, dd, h, i, s] = date.split(/T|:|-/);


    // previous month's last day
    const prev = new Date(new Date().setDate(0)).toISOString();
    const [pyyyy, pmm] = prev.split(/T|:|-/);
Run Code Online (Sandbox Code Playgroud)

请注意,数组解构允许您跳过部分:

    const date = new Date().toISOString();
    const [, , dd, , i] = date.split(/T|:|-/);
Run Code Online (Sandbox Code Playgroud)

说明:上面的代码获取 ISO 日期2019-09-18T13:49:12.775Z并将其拆分为:or-T,它返回一个数组[2019, 09, 18, 13, 49, 12],然后对该数组进行解构

使用setMonth()是错误的:

date = new Date("Dec 31, 2019")
date.setMonth(date.getMonth() - 1);
date; // Dec 1, 2019!
Run Code Online (Sandbox Code Playgroud)


REA*_*REW 5

检查此链接:

http://blog.dansnetwork.com/2008/09/18/javascript-date-object-adding-and-subtracting-months/

编辑:我鼓了一个例子:

Date.prototype.SubtractMonth = function(numberOfMonths) {
var d = this;
d.setMonth(d.getMonth() - numberOfMonths);
d.setDate(1);
return d;
}

$(document).ready(function() {
    var d = new Date();
    alert(d.SubtractMonth(1));
});
Run Code Online (Sandbox Code Playgroud)

安德鲁


小智 5

从一月到十二月移动年份更新

var prevMonth = function(dateObj) {
	var tempDateObj = new Date(dateObj);

	if(tempDateObj.getMonth) {
		tempDateObj.setMonth(tempDateObj.getMonth() - 1);
	} else {
		tempDateObj.setYear(tempDateObj.getYear() - 1);
		tempDateObj.setMonth(12);
	}

	return tempDateObj
};

var wrapper = document.getElementById('wrapper');

for(var i = 0; i < 12; i++) {
	var x = new Date();
  var prevDate = prevMonth(x.setMonth(i));
	var div = document.createElement('div');
  div.textContent = 
  "start month/year: " + i + "/" + x.getFullYear() +
  " --- prev month/year: " + prevDate.getMonth() +
  "/" + prevDate.getFullYear() +
  " --- locale prev date: " + prevDate.toLocaleDateString();
  wrapper.appendChild(div);
}
Run Code Online (Sandbox Code Playgroud)
<div id='wrapper'>
</div>
Run Code Online (Sandbox Code Playgroud)