months example create python datetime timedelta

example - strftime python



Python: datetime para ''hace 3 aƱos hoy''? (6)

En Python, ¿cómo obtengo un objeto datetime para ''hace 3 años hoy''?

ACTUALIZACIÓN: FWIW, no me importa mucho la precisión ... es decir, hoy es 29 de febrero, no me importa si me dieron el 28 de febrero o el 1 de marzo en mi respuesta. La concisión es más importante que la configurabilidad, en este caso.


¿Por qué no simplemente hacer un chequeo para el año bisiesto antes de reemplazar el año? Esto no necesita ningún paquete adicional o prueba: Excepto.

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)


Restar 365 * 3 días es incorrecto, por supuesto, estás cruzando un año bisiesto más de la mitad de las veces.

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

ED: Para que la cuestión del año bisiesto sea correcta,

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


Si necesita ser exacto, use el módulo dateutil para calcular fechas relativas

from datetime import datetime from dateutil.relativedelta import relativedelta three_yrs_ago = datetime.now() - relativedelta(years=3)


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)


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)


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