如何在 Django 数据库中的日期时间字段中减去或添加 100 年?

问题描述 投票:0回答:7

如何在 Django 数据库中的

datetime
字段中减去或加上 100 年?

日期是在数据库里的,我只想直接更新字段,而不是取出来计算然后插入。

python django datetime django-database
7个回答
117
投票

我会使用

relativedelta
包的
dateutil.relativedelta
函数,这将为您提供更准确的“n 年前”计算:

from dateutil.relativedelta import relativedelta
import datetime

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

然后只需更新

date
字段,如其他人在此处所示。


21
投票

使用时间增量。像这样的事情应该可以解决问题:

import datetime
years = 100
days_per_year = 365.24
hundred_years_later = my_object.date + datetime.timedelta(days=(years*days_per_year))

6
投票

Django 查询集上的

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

不幸的是,Python 的 timedelta 不适用于年,因此您必须计算出以天表示的 100 年(即 36524.25):

MyModel.objects.update(timestamp=F('timestamp')+timedelta(days=36524.25))

2
投票

虽然将一年中的天数设置为

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()

希望有帮助!


2
投票

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

import datetime
datetime.date(datetime.date.today().year - 100, datetime.date.today().month, datetime.date.today().day)

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

0
投票

最简单的方法是使用另一个答案中提到的

dateutil.relativedelta
。但是,如果您不想添加对
python-dateutil
的额外依赖,则仅使用标准库模块即可轻松实现相同的逻辑:

from calendar import isleap
from datetime import datetime


def subtract_years(dt, years):
    """Subtract years from a date or datetime."""
    year = dt.year - years
    # if leap day and the new year is not leap, replace year and day
    # otherwise, only replace year
    if (dt.month == 2 and dt.day == 29 and not isleap(year)):
        return dt.replace(year=year, day=28)
    return dt.replace(year=year)

print(subtract_years(datetime(2000, 2, 29), 4))    # 1996-02-29 00:00:00
print(subtract_years(datetime(2000, 2, 29), 100))  # 1900-02-28 00:00:00
© www.soinside.com 2019 - 2024. All rights reserved.