Python:获取“3年前的今天”的日期时间

cunj1qz1  于 2022-12-21  发布在  Python
关注(0)|答案(8)|浏览(238)

在Python中,如何获得一个datetime对象,表示“3年前的今天”?
更新:FWIW,我不太在乎准确性......也就是说,今天是2月29日,我不在乎我的答案是2月28日还是3月1日。在这种情况下,简洁比可配置性更重要。

bihw5rsg

bihw5rsg1#

如果需要精确,请使用dateutil模块计算相对日期

from datetime import datetime
from dateutil.relativedelta import relativedelta

three_yrs_ago = datetime.now() - relativedelta(years=3)
pgvzfuti

pgvzfuti2#

import datetime
datetime.datetime.now() - datetime.timedelta(days=3*365)
lymgl2op

lymgl2op3#

当然,减去365*3天是错误的--你有一半以上的时间是在跨越闰年。

dt = datetime.now()
dt = dt.replace(year=dt.year-3)
# datetime.datetime(2008, 3, 1, 13, 2, 36, 274276)

艾德:为了正确的处理闰年问题,

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
ncecgwcz

ncecgwcz4#

def 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)
2j4z5cfb

2j4z5cfb5#

这也适用于闰年和非闰年的极端情况,因为,如果day = 29和month = 2(Feb),非闰年将抛出一个值错误,因为没有29 th Feb,而Feb的最后一天将是28 th,因此对日期执行-1在try-except块中起作用。

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)
a8jjtwal

a8jjtwal6#

我一直在寻找一个只使用标准库的解决方案,这对我很有效。注意,如果没有检查,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)
erhoui1w

erhoui1w7#

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)
iezvtpos

iezvtpos8#

为什么不简单地做一个检查闰年之前,更换一年。这不需要任何额外的包或尝试:除了。

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)

相关问题