是否有一种方法可以使用Python的标准库轻松确定(即一个函数调用)给定月份的最后一天?
如果标准库不支持,那么dateutil包是否支持此功能?
我是唯一一个认为你在要求Python的最后一天的人吗?:d[20081124从回复移动到评论---在引入评论系统之前发布了原始回复]
我之前在查看日历模块的文档时没有注意到这一点,但是一个名为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也支持闰年:
>>> from calendar import monthrange
>>> monthrange(2012, 2)
(2, 29)
我以前的回答仍然有效,但显然是次优的。
这不是原始问题的正确答案!如果一个月的最后一天是周六/周日呢?
@马赫迪:没错,第二个数字是"月份天数"=="最后一天",不管是哪一天。
对于1800年2月,这是错误的一天。我不明白
@剑1号,我认为用公历的规则来回答,这是正确的。
如果不想导入calendar模块,简单的两步功能还可以是:
import datetime
def last_day_of_month(any_day):
next_month = any_day.replace(day=28) + datetime.timedelta(days=4) # this will never fail
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)
>>>
事实上,我会称之为清洁剂,除了12月份当today.month + 1 == 13和你得到一个ValueError时它失效的事实。
你可以通过使用(today.month % 12) + 1来解决这个问题,因为12 % 12给出0
编辑:看看我的其他答案。它有一个比这个更好的实现,我把它留在这里,以防有人有兴趣看到一个可能"滚动您自己的"计算器。
@约翰·米利金给出了一个很好的答案,另外还有计算下个月第一天的复杂度。
以下不是特别优雅,但要想找出任何给定日期所在月份的最后一天,您可以尝试:
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)
号
这听起来很傻,但我如何得到第一天的一个月类似这样。
不是总是1吗?
是的,但我很困惑,我在找这样的东西:开始日期=日期(datetime.now().year,datetime.now().month,1)
啊。today = datetime.date.today(); start_date = today.replace(day=1)。您应该避免调用datetime.now两次,以防您在12月31日午夜之前调用它,然后在午夜之后调用它。你将得到20