如何在Django的数据库中减去或添加100年到datetime字段?

时间:2011-05-03 14:36:19

标签: python django datetime django-database

如何在Django数据库中的datetime字段中减去或添加100年?

日期在数据库中,我只是想直接更新字段而不检索它来计算然后插入。

7 个答案:

答案 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)