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)