在Python中,我如何获得“三年前今天”的日期时间对象?
更新:FWIW,我不特别关心准确性...即今天是2月29日,我不介意在我的答案中给出2月28日或3月1日。在这种情况下,简洁比可配置性更重要。
更新:FWIW,我不特别关心准确性...即今天是2月29日,我不介意在我的答案中给出2月28日或3月1日。在这种情况下,简洁比可配置性更重要。
如果您需要精确计算相对日期,请使用dateutil模块
from datetime import datetime
from dateutil.relativedelta import relativedelta
three_yrs_ago = datetime.now() - relativedelta(years=3)
import datetime
datetime.datetime.now() - datetime.timedelta(days=3*365)
减去365*3天是错误的,当然——你大部分时间都会跨越一个闰年。
dt = datetime.now()
dt = dt.replace(year=dt.year-3)
# datetime.datetime(2008, 3, 1, 13, 2, 36, 274276)
ED:为了解决闰年问题,
def subtract_years(dt, years):
try:
dt = dt.replace(year=dt.year-years)
except ValueError:
dt = dt.replace(year=dt.year-years, day=dt.day-1)
return dt
datetime.datetime(2008,2,29).replace(year=2005) -> ValueError
。我想捕获这个错误并减去一个额外的天数仍然更加准确。 - Jochen Ritzelreplace
。它比我的解决方案更简单。 - Mark Ransomdef add_years(dt, years):
try:
result = datetime.datetime(dt.year + years, dt.month, dt.day, dt.hour, dt.minute, dt.second, dt.microsecond, dt.tzinfo)
except ValueError:
result = datetime.datetime(dt.year + years, dt.month, dt.day - 1, dt.hour, dt.minute, dt.second, dt.microsecond, dt.tzinfo)
return result
>>> add_years(datetime.datetime.now(), -3)
datetime.datetime(2008, 3, 1, 12, 2, 35, 22000)
>>> add_years(datetime.datetime(2008, 2, 29), -3)
datetime.datetime(2005, 2, 28, 0, 0)
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)
我曾试图只使用标准库来解决问题,并且这个方法对我奏效了。请注意,如果没有检查,大多数年份的2月29日将会给你一个ValueError
。在其他所有日期,它将会给出“三年前今天”的日期。
today = date.today()
day = 28 if today.month == 2 and today.day == 29 else today.day
three_years_ago = date(today.year - 3, today.month, day)
def years_ago(dt, years):
if dt.month == 2 and dt.day == 29:
dt = dt.replace(day=28)
return dt.replace(year=dt.year - years)