首页 > 解决方案 > 获取上个月的第一天 - 月份必须在 1..12

问题描述

我试过这个,我得到一个错误month must be in 1..12

today_date = date.today()
# ERROR - month value becomes -1 here instead of 12
previous_month_4_start_date = today_date.replace(month=today_date.month - 4, day=1)

我可以编写一些样板代码来解决这个问题,但寻找一种有效的方法,如果month-1-2-3-4则应该将它分别替换为1211109

请帮忙

编辑

感谢您对本月的帮助,如何照顾年部分,因为它也会从2020变为2019?请帮忙

标签: pythonpython-3.xdatetimedatetime-formatpython-datetime

解决方案


可以使用modulo算术来解决这个问题,但首先你必须将month数字转换为一个有效的模 12 的值(即0-11),方法是从中减去一个。然后,您可以从该值中减去月份,取模并通过再次加 1n将其转换回数字:month

today_date = date.today()

previous_month_4_start_date = today_date.replace(month=(today_date.month - 1 - 4) % 12 + 1, day=1)
print(previous_month_4_start_date)

输出(截至2020-04-14):

2020-12-01

这不涉及年份变化的事实,为此您需要将当前月份与被减去的数字进行比较,如果它大于当前月份,还从年份中减去一个:

previous_month_4_start_date = today_date.replace(year=today_date.year-1 if today_date.month <= 4 else today_date.year,
                                                 month=(today_date.month - 1 - 4) % 12 + 1, 
                                                 day=1)

输出:

2019-12-01

这是很难做到的。简单的解决方案是设置dayto1然后使用relativedelta减去 4 个月:

from datetime import date
from dateutil.relativedelta import relativedelta

today_date = date.today()

previous_month_4_start_date = today_date.replace(day = 1) - relativedelta(months = 4)
print(previous_month_4_start_date)

输出:

2019-12-01

推荐阅读