在javascript中查找上个月的第一天
Posted
技术标签:
【中文标题】在javascript中查找上个月的第一天【英文标题】:Find first day of previous month in javascript 【发布时间】:2010-10-10 22:41:24 【问题描述】:给定一个日期对象,如何在javascript中获取其上个月的第一天
【问题讨论】:
一个更具描述性的标题可能会很好...... ***.com/questions/594054/date-problem-in-java 看起来您之前的问题是针对 java 的。所以不完全是重复的:) 使用moment.jsmoment().subtract(1, "months").startOf("months").toDate()
。
【参考方案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:***.com/questions/499838/javascript-date-next-month 如果他在 setMonth() 之前 setDate(1) 不会失败 -1 getYear() 已损坏,您应该改用 getFullYear() 好消息@JK。不知道它是怎么溜进去的。 @Chronix3,首先,getMonth
、setMonth
和 Date
构造函数使用从零开始的月份(很奇怪,我知道)所以一月表示为零,二月表示为 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))()
【讨论】:
以上是关于在javascript中查找上个月的第一天的主要内容,如果未能解决你的问题,请参考以下文章
java中定义一个字符串类型的日期 算出这个月的第一天和下个月的第一天。
sql 使用date_trunc(),add_months(),last_day()查找previuos /下个月的第一天和最后一天