如何在 Python 中获得下个月的第一天?

Flu*_*lux 15 python python-datetime

如何在 Python 中获取下个月的第一个日期?例如,如果现在是 2019-12-31,则下个月的第一天是 2020-01-01。如果现在是 2019-08-01,那么下个月的第一天就是 2019-09-01。

我想出了这个:

import datetime

def first_day_of_next_month(dt):
    '''Get the first day of the next month. Preserves the timezone.

    Args:
        dt (datetime.datetime): The current datetime

    Returns:
        datetime.datetime: The first day of the next month at 00:00:00.
    '''
    if dt.month == 12:
        return datetime.datetime(year=dt.year+1,
                                 month=1,
                                 day=1,
                                 tzinfo=dt.tzinfo)
    else:
        return datetime.datetime(year=dt.year,
                                 month=dt.month+1,
                                 day=1,
                                 tzinfo=dt.tzinfo)


# Example usage (assuming that today is 2021-01-28):
first_day_of_next_month(datetime.datetime.now())
# Returns: datetime.datetime(2021, 2, 1, 0, 0)
Run Code Online (Sandbox Code Playgroud)

这是正确的吗?有没有更好的办法?

Tob*_*tty 34

这是一个仅使用标准datetime库的单行解决方案:

(dt.replace(day=1) + datetime.timedelta(days=32)).replace(day=1)
Run Code Online (Sandbox Code Playgroud)

例子:

>>> dt = datetime.datetime(2016, 2, 29)
>>> print((dt.replace(day=1) + datetime.timedelta(days=32)).replace(day=1))
2016-03-01 00:00:00

>>> dt = datetime.datetime(2019, 12, 31)
>>> print((dt.replace(day=1) + datetime.timedelta(days=32)).replace(day=1))
2020-01-01 00:00:00

>>> dt = datetime.datetime(2019, 12, 1)
>>> print((dt.replace(day=1) + datetime.timedelta(days=32)).replace(day=1))
2020-01-01 00:00:00
Run Code Online (Sandbox Code Playgroud)

  • 非常聪明!无需知道任何特定月份的确切天数,只需选择一个肯定大于任何月份但小于任何 2 个月总和的数字即可!(所以 31-58 之间的每个数字都可以,对吧..?) (5认同)

Ada*_*Er8 10

您可以使用calendar获取给定月份的天数,然后添加timedelta(days=...),如下所示:

from datetime import date, timedelta
from calendar import monthrange

days_in_month = lambda dt: monthrange(dt.year, dt.month)[1]
today = date.today()
first_day = today.replace(day=1) + timedelta(days_in_month(today))
print(first_day)
Run Code Online (Sandbox Code Playgroud)

如果你对外部 deps 没问题,你可以使用dateutil(我喜欢......)

from datetime import date
from dateutil.relativedelta import relativedelta

today = date.today()
first_day = today.replace(day=1) + relativedelta(months=1)
print(first_day)
Run Code Online (Sandbox Code Playgroud)


eum*_*iro 5

使用dateutil你可以做到最字面上的可能:

import datetime
from dateutil import relativedelta
today = datetime.date.today()

next_month = today + relativedelta.relativedelta(months=1, day=1)
Run Code Online (Sandbox Code Playgroud)

在英语:1个月(S)添加到今天的日期和当天(月)设置为1注的单数和复数形式的使用day(s)month(s)。单数将属性设置为一个值,复数添加句点数。

您可以将此relativedelta.relativedelta对象存储到变量中并将其传递。其他答案涉及更多的编程逻辑。

编辑你也可以用标准datetime库来做,但它不是那么漂亮:

next_month = (today.replace(day=1) + datetime.timedelta(days=32)).replace(day=1)
Run Code Online (Sandbox Code Playgroud)

将日期设置为当月的第一天,加上 32 天(或 31 到 59 之间的任何数字,保证跳到下个月),然后将日期设置为该月的第一天。