关于datetime:如何在Python中找到下个月的第n天?

How do I find the nth day of the next month in Python?

我想从下个月的nth日减去今天的日期,得到delta日。

1
2
delta = nth_of_next_month - todays_date
print delta.days

如何获取第一个(或第二个、第三个)的日期对象?下个月的第n天。我尝试从日期对象中提取月数并将其增加1。这显然是个愚蠢的想法,因为12+1=13。我也试着在今天加上一个月,然后试着进入第一个月。我相信有一种更有效的方法可以做到这一点。


dateutil库可用于:

1
2
3
4
5
from dateutil.relativedelta import relativedelta
from datetime import datetime

# Where day is the day you want in the following month
dt = datetime.now() + relativedelta(months=1, day=20)


这应该很简单,除非我在你的问题中遗漏了一些东西:

1
2
3
4
5
6
7
8
import datetime

now = datetime.datetime.now()
nth_day = 5
next_month = now.month + 1 if now.month < 12 else 1 # February
year = now.year if now.month < 12 else now.year+1
nth_of_next_month = datetime.datetime(year, next_month, nth_day)
print(nth_of_next_month)

结果:

1
2014-02-05 00:00:00

不过,按照另一个答案中的建议,使用dateutil比这个好得多。


另一种选择是使用Delorean图书馆:

Delorean is a library that provides easy and convenient datetime
conversions in Python.

1
2
3
4
5
6
>>> from delorean import Delorean
>>> d = Delorean()
>>> d.next_month()
Delorean(datetime=2014-02-15 18:51:14.325350+00:00, timezone=UTC)
>>> d.next_month().next_day(2)
Delorean(datetime=2014-02-17 18:51:14.325350+00:00, timezone=UTC)


我在没有外部库的情况下计算下个月的方法:

1
2
3
4
5
def nth_day_of_next_month(dt, n):
    return dt.replace(
        year=dt.year + (dt.month // 12),  # +1 for december, +0 otherwise
        month=(dt.month % 12) + 1,        # december becomes january
        day=n)

这对datetime.datetime()datetime.date()对象都有效。

演示:

1
2
3
4
5
6
7
8
>>> import datetime
>>> def nth_day_of_next_month(dt, n):
...     return dt.replace(year=dt.year + (dt.month // 12), month=(dt.month % 12) + 1, day=n)
...
>>> nth_day_of_next_month(datetime.datetime.now(), 4)
datetime.datetime(2014, 2, 4, 19, 20, 51, 177860)
>>> nth_day_of_next_month(datetime.date.today(), 18)
datetime.date(2014, 2, 18)


在不使用任何外部库的情况下,可以通过以下方式实现

1
2
3
4
5
6
from datetime import datetime, timedelta

def nth_day_of_next_month(n):
    today = datetime.now()
    next_month_dt = today + timedelta(days=32-today.day)
    return next_month_dt.replace(day=n)