60

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

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

4

6 回答 6

104

我会使用包的relativedelta功能dateutil.relativedelta,这将为您提供更准确的“n 年前”计算:

from dateutil.relativedelta import relativedelta
import datetime

years_ago = datetime.datetime.now() - relativedelta(years=5)

然后像其他人在此处显示的那样简单地更新该date字段。

于 2011-05-03T15:28:34.603 回答
13

使用timedelta。这样的事情应该可以解决问题:

import datetime
years = 100
days_per_year = 365.24
hundred_years_later = my_object.date + datetime.timedelta(days=(years*days_per_year))
于 2011-05-03T14:53:47.950 回答
6

Django 查询集上的.update()方法允许您更新所有值,而无需从数据库中检索对象。您可以使用F()对象引用现有值。

不幸的是,Python 的 timedelta 不适用于年,因此您必须计算出以天为单位的 100 年(它是 36524.25):

MyModel.objects.update(timestamp=F('timestamp')+timedelta(days=36524.25))
于 2011-05-03T15:22:52.847 回答
2

虽然将一年中的天数设置为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()

希望能帮助到你!

于 2020-04-19T13:35:18.400 回答
1

我知道这是一个老问题,但我很难找到一个好的问题来解决我的问题,我创建了这个:使用加号(+)或减号(-)来处理:

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
于 2017-12-13T14:35:40.413 回答
1

从今天减去年份并使用此格式。x = datetime.datetime(2020 - 100, 5, 17)

import datetime
datetime.date(datetime.date.today().year - 100, datetime.date.today().month, datetime.date.today().day)
于 2021-04-17T01:55:08.247 回答