usar tiempo sumar restar poner partir hora fecha crear como clase campo actual python django datetime django-database

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í.