Как я могу вычесть или добавить 100 лет к полю datetime
в базе данных в Django?
Дата находится в базе данных, я просто хочу напрямую обновить поле, не извлекая его, чтобы вычислить, а затем вставить.
Как я могу вычесть или добавить 100 лет к полю datetime
в базе данных в Django?
Дата находится в базе данных, я просто хочу напрямую обновить поле, не извлекая его, чтобы вычислить, а затем вставить.
Я бы использовал функцию relativedelta
пакета dateutil.relativedelta
, которая даст вам более точный расчет «n лет назад»:
from dateutil.relativedelta import relativedelta
import datetime
years_ago = datetime.datetime.now() - relativedelta(years=5)
Затем просто обновите поле date
, как показано здесь другими.
Используйте timedelta. Что-то вроде этого должно помочь:
import datetime
years = 100
days_per_year = 365.24
hundred_years_later = my_object.date + datetime.timedelta(days=(years*days_per_year))
Метод .update()
в наборе запросов Django позволяет обновлять все значения, не извлекая объект из базы данных. Вы можете обратиться к существующему значению, используя F()
объект.
К сожалению, временная дельта Python не работает с годами, поэтому вам придется вычислить 100 лет, выраженных в днях (это 36524,25):
MyModel.objects.update(timestamp=F('timestamp')+timedelta(days=36524.25))
relativedate()
вместо timedelta()
, если вам нужна такая точность.
- person vdboor; 29.02.2012
F()
объектами. .2425 в числе 365.2425 — это бит, который пытается учитывать високосные годы, насколько это возможно с F()
объектами.
- person Will Hardy; 01.03.2012
Хотя установка количества дней в году как 365.25
(от (365+365+365+366)/4
) полностью компенсирует ошибку разницы в днях, иногда это приводит к нежелательным результатам, поскольку вы можете вызвать нежелательные изменения в атрибутах, отличных от year
. , особенно когда вы добавляете/вычитаете 1 или несколько лет.
Если вы хотите просто изменить year
, не допуская изменений в других атрибутах даты и времени, просто выполните алгебру для атрибута year
следующим образом:
from datetime import datetime
d = my_obj.my_datetime_field
""" subtract 100 years. """
my_obj.my_datetime_field = datetime(d.year-100, d.month, d.day, d.hour, d.minute, d.second, d.microsecond, d.tzinfo)
my_obj.save()
Надеюсь, поможет!
Я знаю, что это старый вопрос, но у меня была проблема найти хороший способ решить мою проблему, я создал это: используйте плюс (+) или минус (-) для обработки:
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
Вычтите год из сегодняшнего дня и используйте этот формат. х = дата-время.дата-время (2020 - 100, 5, 17)
import datetime
datetime.date(datetime.date.today().year - 100, datetime.date.today().month, datetime.date.today().day)