【问题标题】:Find first day of previous month in javascript在javascript中查找上个月的第一天
【发布时间】:2010-10-10 22:41:24
【问题描述】:

给定一个日期对象,如何在javascript中获取其上个月的第一天

【问题讨论】:

标签: javascript


【解决方案1】:
function firstDayInPreviousMonth(yourDate) {
    var d = new Date(yourDate);
    d.setDate(1);
    d.setMonth(d.getMonth() - 1);
    return d;
}

编辑:好吧...我肯定在这里学到了一些东西。我认为这是涵盖所有情况的最简单的解决方案(是的,它确实适用于 1 月份):

function firstDayInPreviousMonth(yourDate) {
    return new Date(yourDate.getFullYear(), yourDate.getMonth() - 1, 1);
}

【讨论】:

  • 请注意,这将失败,例如:firstDayInPreviousMonth(new Date("Mar 31 2009"))。查看 cmets:stackoverflow.com/questions/499838/javascript-date-next-month
  • 如果他在 setMonth() 之前 setDate(1) 不会失败
  • -1 getYear() 已损坏,您应该改用 getFullYear()
  • 好消息@JK。不知道那是怎么溜进去的。
  • @Chronix3,首先,getMonthsetMonthDate 构造函数使用从零开始的月份(很奇怪,我知道)所以一月表示为零,二月表示为 1,等等。这里真正的魔力在于 js Date 对象足够灵活,可以通过包装到下个月或上个月来补偿超出范围的日期。例如,Date(2014, 0, 31) = 1 月 31 日,Date(2014, 0, 32) = 2 月 1 日,Date(2014, -1, 25) = 2013 年 12 月 25 日。这是为了便于进行数学运算。例如,我总是可以使用 dt.setDate(dt.getDate() + 1) 增加一天。
【解决方案2】:

以下应该有效:

now = new Date();
if (now.getMonth() == 0) {
    current = new Date(now.getFullYear() - 1, 11, 1);
} else {
    current = new Date(now.getFullYear(), now.getMonth() - 1, 1);
}

请记住,月份是从零开始的,因此 12 月是 11 而不是 12。

但是,正如其他人所指出的,月份会换行,即使是作为原子构造函数的一部分,所以以下也是可能的:

now = new Date();
firstDayPrevMonth = new Date(now.getFullYear(), now.getMonth() - 1, 1);

【讨论】:

  • 我喜欢这种方法,但您的解决方案实际上是不正确的。当 getMonth() == 1 时,月份为二月。您想要检查 getMonth() == 0,即使这样也不是必需的,因为 Date 构造函数将接受负值并正常工作。
  • 您忽略了 setMonth 将包装值的事实。 Prestaul 的回答在 1 月份效果很好。
  • 是的,但不幸的是,不能回到天数较少的月份。最好以原子方式而不是零碎地构造新日期。
  • 考虑到 3 月 31 日的例子,你对解剖日期的构造是正确的 - 如果你改变你的答案(我确实发现“盲目减去一个月”行会误导 javascript 的 setXXX 包装)我'很乐意调整我对这个答案的投票。
  • 我同意。如果你取消一月份的测试,你也会得到我的投票。
【解决方案3】:

我喜欢这个解决方案。它可能不是最简短的,但它突出了 Date() 对象上的 setDate() 方法的一些功能,这些功能并不是每个人都熟悉的:

function firstDayPreviousMonth(originalDate) {
    var d = new Date(originalDate);
    d.setDate(0); // set to last day of previous month
    d.setDate(1); // set to the first day of that month
    return d;
}

它利用 .setDate(0) 将日期更改为指向上个月的最后一天,而 .setDate(1) 将其更改为(进一步)指向该日期的第一天这一事实月。它让核心 Javascript 库完成繁重的工作。

你可以看到working Plunk here

【讨论】:

  • 这很奇怪而且出乎意料。我喜欢它:)
【解决方案4】:

这将有助于获取上个月的第一个和最后一个日期。

    function getLastMonth(){
        var now = new Date();
        var lastday  = new Date(now.getFullYear(), now.getMonth(), 0);
        var firstday = new Date(lastday.getFullYear(), lastday.getMonth(), 1);
        var lastMonth = firstday.getDate()+'/'+(firstday.getMonth()+1)+'/'+firstday.getFullYear()+' - '+lastday.getDate()+'/'+(firstday.getMonth()+1)+'/'+lastday.getFullYear();
        return lastMonth;
    }

【讨论】:

  • 谢谢,正是我想要的。
【解决方案5】:

为什么要重新发明轮子?

使用moment.js 或替代方案之一(Luxon、Day.js 等):

moment().subtract(1, "months").startOf("months").toDate().

【讨论】:

    【解决方案6】:

    我需要在 BootStrap Min 月中使用当月的乞求,不想全部写出来。

    (() => new Date(new Date().getFullYear(), new Date().getMonth(),1, 0))()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-18
      • 2023-02-25
      • 2011-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多