【问题标题】:Getting the previous month's first date from current date in JavaScript在 JavaScript 中从当前日期获取上个月的第一个日期
【发布时间】:2009-03-03 08:39:10
【问题描述】:

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

【问题讨论】:

标签: javascript


【解决方案1】:

很简单,用date methods:

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

【讨论】:

  • 不,它会自动调整日期
  • 这就是为什么您使用本机日期方法而不是使用您自己的日历算术来执行此操作的原因。上帝我爱 JS :)
  • 不幸的是,在 JavaScript 后期版本中不推荐使用 'with' 关键字:( 来源:stackoverflow.com/questions/61552/…
  • 另外,你应该写 x.setMonth(x.getMonth()-1);否则你最终会得到一个未定义的引用
  • 当天变成 31 时它不起作用,就像天变成了 2014-07-31
【解决方案2】:

最简单的方法是:

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

【讨论】:

  • 这适用于我测试过的所有情况:平日、每月 31 日、闰年 2 月 28 日、1 月 1 日(回滚到上一年的 12 月)。它只是有效,应该是公认的答案。疯了,这个问题是在 2009 年提出的。
  • 我在 SO 上看到的最被低估的答案。
  • 我知道有点偏离主题,但为什么在设置日期时这不起作用:new Date(2020, 1, 1) but works with new Date()?
  • @Mafster 这是因为月份从 0 开始。您实际上是先显示二月。
  • 只是为了向不了解该方法的任何人澄清一下,这是因为x.setDate(0) 将日期设置为最后几个月的最后一天,并且由于日期现在引用上个月,当你这样做时@ 987654323@ 它会为您提供该月的第一天。相当不错的解决方案。
【解决方案3】:

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

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】:

    这对我有用

    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' }));
    

    【讨论】:

      【解决方案5】:

      重要提示:这里使用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] ,然后得到 destructured .

      使用setMonth()是错误的:

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

      【讨论】:

        【解决方案6】:

        查看此链接:

        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));
        });
        

        【讨论】:

        • 嗨,安德鲁,您告诉的解决方案从当前日期精确返回 30 天。我需要上个月的第一个日期,与当前月份的任何日期无关。
        • 此解决方案不起作用。 Date.setMonth() 不接受除 -1 之外的负值,这将导致上一年的最后一个月 w3schools.com/jsref/jsref_setmonth.asp
        • 这个答案有问题,例如“2018 年 12 月 31 日”会失败
        【解决方案7】:

        要获取上个月的上午 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);
        

        希望这会有所帮助!

        【讨论】:

          【解决方案8】:
          //  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 ...它给出了上个月的最后一个日期和结束日期,本月和下个月也是如此。
          【解决方案9】:

          //试试这个就好了

          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)
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-12-23
            • 2020-01-17
            • 2019-09-15
            • 2012-10-27
            • 2021-01-07
            • 2021-12-01
            • 2012-05-29
            • 1970-01-01
            相关资源
            最近更新 更多