协慌网

登录 贡献 社区

如何获得每月的最后一天?

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

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

答案

calendar.monthrange提供以下信息:

日历。月范围(年,月)
返回指定年份月份的月份的第一天的工作日以及月份中的天数。

>>> import calendar
>>> calendar.monthrange(2002, 1)
(1, 31)
>>> calendar.monthrange(2008, 2)  # leap years are handled correctly
(4, 29)
>>> calendar.monthrange(2100, 2)  # years divisible by 100 but not 400 aren't leap years
(0, 28)

所以:

calendar.monthrange(year, month)[1]

似乎是最简单的方法。

如果您不想导入calendar模块,那么一个简单的两步函数也可以是:

import datetime

def last_day_of_month(any_day):
    # this will never fail
    # get close to the end of the month for any day, and add 4 days 'over'
    next_month = any_day.replace(day=28) + datetime.timedelta(days=4)
    # subtract the number of remaining 'overage' days to get last day of current month, or said programattically said, the previous day of the first of next month
    return next_month - datetime.timedelta(days=next_month.day)

输出:

>>> for month in range(1, 13):
...     print last_day_of_month(datetime.date(2012, month, 1))
...
2012-01-31
2012-02-29
2012-03-31
2012-04-30
2012-05-31
2012-06-30
2012-07-31
2012-08-31
2012-09-30
2012-10-31
2012-11-30
2012-12-31

编辑:请参阅 @Blair Conrad 的答案以获得更清洁的解决方案


>>> import datetime
>>> datetime.date(2000, 2, 1) - datetime.timedelta(days=1)
datetime.date(2000, 1, 31)