python - 获取上个月的第一天 - 月份必须在 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
则应该将它分别替换为12
或11
或10
或9
。
请帮忙
编辑
感谢您对本月的帮助,如何照顾年部分,因为它也会从2020
变为2019
?请帮忙
解决方案
你可以使用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
但
这是很难做到的。简单的解决方案是设置day
to1
然后使用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
推荐阅读
- javascript - 无法将值保存到 JS 中的现有 li 和 span 标签中
- php - Laravel:从 5.4 升级到 5.5 后不显示调试屏幕
- c# - 我如何在 C# 的任务中获取此树视图节点
- .net - 消息代理(Kafka、RabbitMQ)VS 服务总线(nServiceBus)
- php - 在 PHP 中输出一个数组,数组内的数组
- c# - 通过本地和本地主机的 SQL 连接问题
- php - 如果 HTTP 是无状态的,PHP 如何知道窗口何时关闭(用于会话终止)
- facebook - Facebook 应用重新提交
- keyboard - eglfs:键盘没有被抓住
- css - 生成多个 CSS 包并在运行时仅导入必要的包的正确方法是什么?