python获取每月的最后一天_关于日期:使用Python获取本月的最后一天

是否有一种方法可以使用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

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值