使用Python获取本月的最后一天
时间:2020-03-05 18:47:24 来源:igfitidea点击:
是否可以使用Python的标准库轻松确定(即调用一个函数)给定月份的最后一天?
如果标准库不支持该功能,dateutil包是否支持此功能?
解决方案
回答
编辑:请参阅@Blair Conrad的答案以获得更清洁的解决方案
>>> import datetime >>> datetime.date (2000, 2, 1) - datetime.timedelta (days = 1) datetime.date(2000, 1, 31) >>>
回答
编辑:看到我的其他答案。它的实现比该方法更好,我留在这里是为了防止有人感兴趣地看一看如何"滚动自己的"计算器。
@John Millikin提供了一个很好的答案,增加了计算下个月第一天的复杂性。
以下内容并不是特别优雅,但是要弄清楚任何给定日期所在的月份的最后一天,我们可以尝试:
def last_day_of_month(date): if date.month == 12: return date.replace(day=31) return date.replace(month=date.month+1, day=1) - datetime.timedelta(days=1) >>> last_day_of_month(datetime.date(2002, 1, 17)) datetime.date(2002, 1, 31) >>> last_day_of_month(datetime.date(2002, 12, 9)) datetime.date(2002, 12, 31) >>> last_day_of_month(datetime.date(2008, 2, 14)) datetime.date(2008, 2, 29)
回答
当我查看日历模块的文档时,我没有注意到这一点,但是一个名为monthrange的方法提供了以下信息:
monthrange(year, month) Returns weekday of first day of the month and number of days in month, for the specified year and month.
>>> import calendar >>> calendar.monthrange(2002,1) (1, 31) >>> calendar.monthrange(2008,2) (4, 29) >>> calendar.monthrange(2100,2) (0, 28)
所以:
calendar.monthrange(year, month)[1]
似乎是最简单的方法。
明确一点,monthrange
也支持leap年:
>>> from calendar import monthrange >>> monthrange(2012, 2) (2, 29)
我以前的答案仍然有效,但显然不是最佳选择。
回答
另一个解决方案是做这样的事情:
from datetime import datetime def last_day_of_month(year, month): """ Work out the last day of the month """ last_days = [31, 30, 29, 28, 27] for i in last_days: try: end = datetime(year, month, i) except ValueError: continue else: return end.date() return None
并使用如下功能:
>>> >>> last_day_of_month(2008, 2) datetime.date(2008, 2, 29) >>> last_day_of_month(2009, 2) datetime.date(2009, 2, 28) >>> last_day_of_month(2008, 11) datetime.date(2008, 11, 30) >>> last_day_of_month(2008, 12) datetime.date(2008, 12, 31)