在JavaScript中获取当前日期的上一个月的第一天日期

72

请任何人分享JavaScript代码,以查找当前日期的上一个月的第一天。例如,如果当前日期为2009年1月25日,则应该得到2008年12月1日作为结果。


请查看此链接:https://dev59.com/1XRB5IYBdhLWcg3wgHWr - Learning
可能是重复的问题 在JavaScript中找到上个月的第一天 - user142162
12个回答

102

最简单的方法是:

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

7
我已经测试过所有情况,包括平常的日子、一个月的31号、闰年2月份的28号、1月1日(回滚到前一年的12月)。这个方法很有效,应该是被接受的答案。真是太疯狂了,这个问题在2009年就被提出了。 - Devin Fields
6
SO上我看过的最被低估的答案。 - Annosz
我知道有点跑题,但是为什么设置日期时像这样new Date(2020, 1, 1)不起作用,而new Date()可以? - Mafster
1
@Mafster 这是因为月份从0开始计算。实际上,你正在显示二月份的数据。 - Reza Ghorbani
2
只是为了澄清对于不理解这种方法的人,这是有效的因为x.setDate(0)将日期设置为上个月的最后一天,而且由于日期现在正在引用上个月,所以当您执行x.setDate(1)时,它会得到该月的第一天。非常好的解决方法。 - ricks
使用“32”(或更多)代替“0”获取下个月的日期也是同样的原理:x.setDate(32);(结果为下个月初的日期)。 - Redzarf

100

非常直观,使用日期方法即可:

  var x = new Date();
  x.setDate(1);
  x.setMonth(x.getMonth()-1);

2
没有这样的功能可以自动调整日期。 - REA_ANDREW
1
这就是为什么你应该使用本地日期方法而不是搞自己的日历算术。天哪,我爱JS :) - annakata
3
很不幸,在较新的 JavaScript 版本中使用 'with' 关键字已被弃用 :( 来源:https://dev59.com/lXVD5IYBdhLWcg3wL4YA - Design by Adrian
7
此外,您还应编写x.setMonth(x.getMonth()-1);,否则您将得到一个未定义的引用。 - Kris Van den Bergh
8
当日期变成类似于2014年7月31日这样的日期时,它就无法正常工作了。 - user1699797
显示剩余5条评论

8

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

一行代码在2019年可用(使用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|:|-/);

请注意,数组解构使您可以跳过某些部分:
    const date = new Date().toISOString();
    const [, , dd, , i] = date.split(/T|:|-/);
解释:上面的代码获取ISO日期2019-09-18T13:49:12.775Z并将其拆分为:-T,返回一个数组[2019, 09, 18, 13, 49, 12],然后对其进行解构处理

使用 setMonth() 是错误的:

date = new Date("Dec 31, 2019")
date.setMonth(date.getMonth() - 1);
date; // Dec 1, 2019!

6

处理从一月到十二月的年份更新

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);
}
<div id='wrapper'>
</div>


4

嗨,安德鲁,你提供的方案返回的是当前日期30天前的确切日期。我需要上个月的第一天,无论当前月份的日期如何。 - Geetha
这个解决方案不起作用。Date.setMonth() 不接受负值,除了 -1 会导致上一年的最后一个月。http://www.w3schools.com/jsref/jsref_setmonth.asp - idragosalex
这个答案有漏洞,例如对于“2018年12月31日”会失败。 - aleemb

4

这个对我有用

var curDateMonth = new Date();
var prvDateMonth = new Date(curDateMonth.getFullYear(),curDateMonth.getMonth()-1,curDateMonth.getMonth());
console.log(curDateMonth.toLocaleString('en-US', { month: 'long' }) +' vs '+ prvDateMonth.toLocaleString('en-US', { month: 'long' }));

3
要获取上个月的00:00:00,请使用以下方法:
let d = new Date();
d.setDate(1);
d.setMonth(d.getMonth() - 1);
d.setHours(0,0,0,0);
const lastMonthStart = new Date(d);

希望这能帮到你!

2
//  Previous Month Detail
let prevStartDate = new Date(this.date.getFullYear(), this.date.getMonth() - 1, 1);
console.log(prevStartDate);
let preEndDate = new Date(this.date.getFullYear(), this.date.getMonth() - 1 + 1, 0);
console.log(preEndDate);
//Current Month Detail
let cStartDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1);
console.log(cStartDate);
let cEndDate = new Date(this.date.getFullYear(), this.date.getMonth(), 1, 0);
console.log(cEndDate);
//Next Month Detail
let nStartDate = new Date(this.date.getFullYear(), this.date.getMonth() + 1, 1);
console.log(nStartDate);
let nendDate = new Date(this.date.getFullYear(), this.date.getMonth() + 1 + 1, 0);
console.log(nendDate);

你想要实现什么目标?你的评论提到它可以工作! - NitinSingh
虽然这段代码可能回答了问题,但是提供关于为什么和/或如何回答问题的额外上下文可以提高其长期价值。 - Piotr Labunski
@NitinSingh ... 它提供了上个月的第一天和最后一天,因此也可以为本月和下个月执行相同操作。 - Arjunan Ajevar

1

//只是试一下,这将工作得很好

let date = new Date();
let month = new Date().getMonth();
let prevMonth = date.setMonth(month - 1)
let formatPrevMonth = new Date(date.setMonth(month - 1));

console.log(formatPrevMonth)

0
首先,我们将getMonth()赋值给一个变量,并将其增加1:
var currentMonth = date.getMonth()+1;
var current_date = date.getFullYear()+"/"+currentMonth+"/"+date.getDate();
document.getElementById("p3").innerHTML = "Today,s date:"+current_date;

我看到你假设一些HTML存在。但是你只分享了你的JS。你能否编辑你的答案并附加你的HTML,最好是在一个功能性片段中? - Lajos Arpad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接