Python: get datetime for '3 years ago today'
在Python中,如何获取" 3年前的今天"的datetime对象?
更新:FWIW,我不太在乎准确性……也就是说,今天是2月29日,我不在乎我的答案是2月28日还是3月1日。 在这种情况下,简洁比可配置性更重要。
如果需要精确,请使用dateutil模块来计算相对日期
1 2 3 4 | from datetime import datetime from dateutil.relativedelta import relativedelta three_yrs_ago = datetime.now() - relativedelta(years=3) |
1 2 | import datetime datetime.datetime.now() - datetime.timedelta(days=3*365) |
减去365 * 3天当然是错误的-您跨越crossing年的时间超过一半。
1 2 3 | dt = datetime.now() dt = dt.replace(year=dt.year-3) # datetime.datetime(2008, 3, 1, 13, 2, 36, 274276) |
ED:为了正确地解决the年问题,
1 2 3 4 5 6 | 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 |
1 2 3 4 5 6 7 8 9 10 11 | 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) |
尽管使用
1 2 3 4 5 6 | >>> 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 |
如果您需要当前日期时间来进一步使用,则可能应该先将
如果您确实想避免时区,请使用
您不需要将结果转换为原生Python对象,但是如果确实需要,一种实现方法是:
1 2 3 4 5 6 | >>> 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 |
看不到它,它非常简单明了,
1 2 3 4 5 6 | 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日引发错误。
为什么不简单在替换年份之前检查a年。
这不需要任何额外的程序包或try:Except。
1 2 3 4 | 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) |
1 2 3 4 5 6 7 8 | 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) |