tiempo - sumar fecha python
¿Cómo puedo restar o agregar 100 años a un campo de fecha y hora en la base de datos en Django? (5)
¿Cómo puedo restar o agregar 100 años a un campo de datetime
y datetime
en la base de datos en Django?
La fecha está en la base de datos, solo quiero actualizar directamente el campo sin recuperarlo para calcularlo y luego insertarlo.
Cuando obtiene el valor de un campo datetime
Django de la base de datos, se presenta en forma de un objeto datetime
Python.
Creo que la forma más fácil de agregar 100 años a un objeto datetime de Python es la siguiente:
from datetime import datetime
d = datetime_object_from_database
d_plus_100_years = datetime(d.year + 100, *d.timetuple()[1:-2])
Luego guárdalo de nuevo en la base de datos. Sin embargo, como se señaló en los comentarios, esto fallará por completo si la fecha es un día bisiesto en un año que es un múltiplo de 400.
El método .update()
en un conjunto de consultas de Django le permite actualizar todos los valores sin recuperar el objeto de la base de datos. Puede referirse al valor existente usando un objeto F()
.
Desafortunadamente, el timedelta de Python no funciona con años, por lo que deberá calcular los 100 años expresados en días (es 36524.25):
MyModel.objects.update(timestamp=F(''timestamp'')+timedelta(days=36524.25))
Sé que es una pregunta antigua, pero tuve el problema de encontrar una buena para resolver mi problema, he creado esto: use más (+) o menos (-) para manejar:
import datetime # Don''t forget to import it
def subadd_date(date,years):
'''''' Subtract or add Years to a specific date by pre add + or - ''''''
if isinstance(date,datetime.datetime) and isinstance(years,int):
day,month,year = date.day , date.month , date.year
#If you want to have HOUR, MINUTE, SECOND
#With TIME:
# day,month,year,hour,minute,second = date.day, date.month,date.year,date.hour,date.minute,date.second
py = year + years # The Past / Futur Year
new_date_str = "%s-%s-%s" % (day,month,py) # New Complete Date
# With TIME : new_date_str = "%s-%s-%s %s:%s:%s" % (month,day,py,hour,minute,second)
try:
new_date = datetime.datetime.strptime(new_date_str,"%d-%m-%Y")
except ValueError: # day is out of range for month (February 29th)
new_date_str = "%s-%s-%s" % (1,month+1,py) # New Complete Date : March 1st
new_date = datetime.datetime.strptime(new_date_str,"%d-%m-%Y")
return new_date
# With TIME : return datetime.datetime.strptime(new_date_str,"%d-%m-%Y %H:%M:%Y")
return None
Utilice timedelta . Algo como esto debería hacer el truco:
import datetime
years = 100
days_per_year = 365.24
hundred_years_later = my_object.date + datetime.timedelta(days=(years*days_per_year))
Yo usaría la función relativedelta del paquete dateutil.relativedelta, que le dará un cálculo más preciso de ''n años atrás'':
from dateutil.relativedelta import relativedelta
import datetime
years_ago = datetime.datetime.now() - relativedelta(years=5)
Luego simplemente actualice el campo de fecha como otros lo han mostrado aquí.