Python:获取'3年前的'日期时间'

时间:2011-03-01 17:37:07

标签: python datetime timedelta

在Python中,如何在3年前获得日期时间对象?

更新:FWIW,我并不在乎准确性......即今天是2月29日,我不在乎我是在2月28日还是3月1日给出答案。在这种情况下,简洁比可配置性更重要。

8 个答案:

答案 0 :(得分:108)

如果您需要准确使用dateutil模块来计算相对日期

from datetime import datetime
from dateutil.relativedelta import relativedelta

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

答案 1 :(得分:54)

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

答案 2 :(得分:19)

减去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

答案 3 :(得分:4)

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)

答案 4 :(得分:1)

尽管answer using dateutil很好,但是另一种方法是在PyPI上使用pendulum包。有关更多信息,请参阅其docs

>>> import pendulum
>>> dt = pendulum.now().subtract(years=3)
>>> dt
DateTime(2015, 10, 5, 17, 44, 41, 82598, tzinfo=Timezone('America/New_York'))
>>> type(dt)
pendulum.datetime.DateTime

如果您需要当前日期时间以供进一步使用,则可能应该先将pendulum.now()保存到变量中,然后再使用该变量!

如果您确实想避开时区,请使用.naive()

您不需要将结果转换为原生Python对象,但如果确实需要,一种方法是:

>>> import datetime
>>> pydt = datetime.datetime.fromisoformat(dt.isoformat())
>>> pydt
datetime.datetime(2015, 10, 5, 17, 44, 41, 82598, tzinfo=datetime.timezone(datetime.timedelta(days=-1, seconds=72000)))
>>> type(pydt)
datetime.datetime

答案 5 :(得分:0)

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)

答案 6 :(得分:0)

看不到它,而且超级简洁,

In [1]: import datetime

In [2]: dt = datetime.datetime.today()

In [3]: datetime.datetime(year=dt.year-3, month=dt.month, day=dt.day)
Out[3]: datetime.datetime(2016, 4, 11, 0, 0)

注意:它将在2月29日引发错误。

答案 7 :(得分:-1)

为什么不在更换年份前简单检查闰年。 这不需要任何额外的包或尝试:除了。

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)