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

新手上路,请多包涵

如何在 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)

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

原文由 Flux 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.9k
2 个回答

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

 (dt.replace(day=1) + datetime.timedelta(days=32)).replace(day=1)

例子:

 >>> 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

原文由 Toby Petty 发布,翻译遵循 CC BY-SA 4.0 许可协议

使用 dateutil 你可以尽可能地做到这一点:

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

next_month = today + relativedelta.relativedelta(months=1, day=1)

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

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

编辑 您也可以使用标准 datetime 库来完成,但它不是那么漂亮:

 next_month = (today.replace(day=1) + datetime.timedelta(days=32)).replace(day=1)

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

原文由 eumiro 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题