如何在Django数据库中的datetime
字段中减去或添加100年?
日期在数据库中,我只是想直接更新字段而不检索它来计算然后插入。
答案 0 :(得分:60)
我会使用dateutil.relativedelta包的relativedelta函数,这将使你在'n年前'计算更准确:
from dateutil.relativedelta import relativedelta
import datetime
years_ago = datetime.datetime.now() - relativedelta(years=5)
然后只需更新其他人在此处显示的日期字段。
答案 1 :(得分:8)
使用timedelta。这样的事情可以解决问题:
import datetime
years = 100
days_per_year = 365.24
hundred_years_later = my_object.date + datetime.timedelta(days=(years*days_per_year))
答案 2 :(得分:6)
Django查询集上的.update()
方法允许您更新所有值,而无需从数据库中检索对象。您可以使用F()
object来引用现有值。
不幸的是,Python的timedelta多年没有用,所以你必须用数天表示100年(36524.25):
MyModel.objects.update(timestamp=F('timestamp')+timedelta(days=36524.25))
答案 3 :(得分:2)
当您从数据库中获取Django datetime
字段的值时,它将以Python datetime
对象的形式出现。
我认为向Python日期时间对象添加100年的最简单方法是这样的:
from datetime import datetime
d = datetime_object_from_database
d_plus_100_years = datetime(d.year + 100, *d.timetuple()[1:-2])
然后将其保存回数据库。正如评论中所指出的,如果日期是一年中闰日是400的倍数,那么这将完全失败。
答案 4 :(得分:1)
我知道这是一个古老的问题,但我遇到了解决问题的好方法,我创建了这个问题:使用加号(+)或减号( - )来处理:< / p>
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
答案 5 :(得分:0)
尽管将一年中的天数设置为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()
希望有帮助!
答案 6 :(得分:0)
从今天减去年份并使用此格式。 x = datetime.datetime(2020 - 100, 5, 17)
import datetime
datetime.date(datetime.date.today().year - 100, datetime.date.today().month, datetime.date.today().day)