from datetime import datetime
last_year = datetime.today().year - 1
month = datetime.today().month
day = datetime.today().day
try:
# try returning same date last year
last_year_date = datetime.strptime(f"{last_year}-{month}-{day}",'%Y-%m-%d').date()
except ValueError:
# incase of error due to leap year, return date - 1 in last year
last_year_date = datetime.strptime(f"{last_year}-{month}-{day-1}",'%Y-%m-%d').date()
print(last_year_date)
In [3]: import datetime as dt
In [4]: today=dt.date.today()
In [5]: three_years_ago=today-dt.timedelta(days=3*365)
In [6]: three_years_ago
Out[6]: datetime.date(2008, 3, 1)
8条答案
按热度按时间bihw5rsg1#
如果需要精确,请使用dateutil模块计算相对日期
pgvzfuti2#
lymgl2op3#
当然,减去365*3天是错误的--你有一半以上的时间是在跨越闰年。
艾德:为了正确的处理闰年问题,
ncecgwcz4#
2j4z5cfb5#
这也适用于闰年和非闰年的极端情况,因为,如果day = 29和month = 2(Feb),非闰年将抛出一个值错误,因为没有29 th Feb,而Feb的最后一天将是28 th,因此对日期执行-1在try-except块中起作用。
a8jjtwal6#
我一直在寻找一个只使用标准库的解决方案,这对我很有效。注意,如果没有检查,2月29日将为您提供大多数年份的
ValueError
。在所有其他日期,它将为您提供“三年前的今天”的日期。erhoui1w7#
iezvtpos8#
为什么不简单地做一个检查闰年之前,更换一年。这不需要任何额外的包或尝试:除了。