繁体   English   中英

获取上个月的第一天 - 月份必须在 1..12

[英]Get first day of previous month - month must be in 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 ,因此如何照顾年部分? 请帮忙

可以对这个问题使用modulo算术,但首先您必须通过从中减去一个将month数转换为有效模 12 的值(即0-11 )。 然后,您可以从该值中减去n个月,取模并通过再次加 1 将其转换回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 年 4 月 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)

Output:

2019-12-01

这是很难做到的。 简单的解决方案是将day设置为1 ,然后使用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)

Output:

2019-12-01

模数运算符是您最好的选择。 它完全符合您的需要。 您需要减去 5 而不是 4,因为数字需要变成负数才能使代码正常工作:

previous_month_4_start_date = today_date.replace(month=(today_date.month - 5) % 12 + 1, day=1)
# Returns: 12
#Try this to get the previous month's first day    

from datetime import datetime,date
today_date = date.today()
if today_date.month == 1:
    previous_month_4_start_date = today_date.replace(month=(12), day=1)
else:
    previous_month_4_start_date = today_date.replace(month=(today_date.month-1), day=1)
day_name= ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday','Sunday']
print(day_name[previous_month_4_start_date.weekday()])
print(previous_month_4_start_date)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM