如何datetime
在 Django 数据库中的字段中减去或添加 100 年?
日期在数据库中,我只想直接更新字段而不将其检索出来计算然后插入。
如何datetime
在 Django 数据库中的字段中减去或添加 100 年?
日期在数据库中,我只想直接更新字段而不将其检索出来计算然后插入。
我会使用包的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))
Django 查询集上的.update()
方法允许您更新所有值,而无需从数据库中检索对象。您可以使用F()
对象引用现有值。
不幸的是,Python 的 timedelta 不适用于年,因此您必须计算出以天为单位的 100 年(它是 36524.25):
MyModel.objects.update(timestamp=F('timestamp')+timedelta(days=36524.25))
虽然将一年中的天数设置为365.25
(from (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
从今天减去年份并使用此格式。x = datetime.datetime(2020 - 100, 5, 17)
import datetime
datetime.date(datetime.date.today().year - 100, datetime.date.today().month, datetime.date.today().day)