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

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


当前回答

如果您需要获得一个月的第一天的0:00时间,并且不想导入任何特殊的库,您可以这样写

import pytz
from datetime import datetime, timedelta

# get now time with timezone (optional)
now = datetime.now(pytz.UTC)

# get first day on this month, get last day on prev month and after get first day on prev month with min time
fist_day_with_time = datetime.combine((now.replace(day=1) - timedelta(days=1)).replace(day=1), datetime.min.time())

2月28日至29日,12月至1月,以及另一个问题日期,工作正常。

其他回答

from datetime import timedelta
(any_day.replace(day=1) + timedelta(days=32)).replace(day=1) - timedelta(days=1)

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

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 datetime import timedelta as td
from datetime import datetime as dt
today = dt.now()
a_day_next_month = dt(today.year, today.month, 27) + td(days=5)
first_day_next_month =  dt(a_day_next_month.year, a_day_next_month.month, 1)
last_day_this_month = first_day_next_month - td(days=1)

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

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

这实际上很简单,dateutil.relativelta.day=31将始终返回该月的最后一天:

import datetime
from dateutil.relativedelta import relativedelta

date_in_feb = datetime.datetime(2013, 2, 21)
print(datetime.datetime(2013, 2, 21) + relativedelta(day=31))  # End-of-month
# datetime.datetime(2013, 2, 28, 0, 0)

使用安装dateutil

pip install python-datetutil