有没有一种方法可以使用Python的标准库轻松确定(即一个函数调用)给定月份的最后一天?

如果标准库不支持,dateutil包是否支持此功能?


当前回答

这是我的方式-一个只有两行的函数:

from dateutil.relativedelta import relativedelta

def last_day_of_month(date):
    return date.replace(day=1) + relativedelta(months=1) - relativedelta(days=1)

例子:

from datetime import date

print(last_day_of_month(date.today()))
>> 2021-09-30

其他回答

为了获得本月的最后一个日期,我们可以这样做:

from datetime import date, timedelta
import calendar
last_day = date.today().replace(day=calendar.monthrange(date.today().year, date.today().month)[1])

现在,为了解释我们在这里做的事情,我们将把它分成两部分:

首先是获取当前月份的天数,我们使用了月份范围,Blair Conrad已经提到了他的解决方案:

calendar.monthrange(date.today().year, date.today().month)[1]

第二个是获得最后一次约会,这是我们在替换的帮助下完成的

>>> date.today()
datetime.date(2017, 1, 3)
>>> date.today().replace(day=31)
datetime.date(2017, 1, 31)

当我们按照上面提到的方法将它们结合起来时,我们得到了一个动态的解决方案。

这是我的方式-一个只有两行的函数:

from dateutil.relativedelta import relativedelta

def last_day_of_month(date):
    return date.replace(day=1) + relativedelta(months=1) - relativedelta(days=1)

例子:

from datetime import date

print(last_day_of_month(date.today()))
>> 2021-09-30
import datetime

now = datetime.datetime.now()
start_month = datetime.datetime(now.year, now.month, 1)
date_on_next_month = start_month + datetime.timedelta(35)
start_next_month = datetime.datetime(date_on_next_month.year, date_on_next_month.month, 1)
last_day_month = start_next_month - datetime.timedelta(1)

下面是一个基于python lambdas的解决方案:

next_month = lambda y, m, d: (y, m + 1, 1) if m + 1 < 13 else ( y+1 , 1, 1)
month_end  = lambda dte: date( *next_month( *dte.timetuple()[:3] ) ) - timedelta(days=1)

next_month lambda查找下个月第一天的元组表示形式,并滚动到下一年。month_end lambda将日期(dte)转换为元组,应用next_month并创建新日期。那么“月底”就是下个月的第一天减去时间增量(天=1)。

使用dateutil.rrelatedelta

dt + dateutil.relativedelta.relativedelta(months=1, day=1, days=-1)

months=1,days=1将dt移到下个月的第一个日期,然后days=-1将新日期移到上一个日期,这正好是当前月份的最后一个日期。