【问题标题】:How can I subtract or add 100 years to a datetime field in the database in Django?如何在 Django 数据库中的日期时间字段中减去或添加 100 年?
【发布时间】:2011-08-17 18:56:05
【问题描述】:

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

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

【问题讨论】:

  • 什么意思?是否要将数据库中的所有日期修改 100 年?你想写一个比较日期 + 100 年的查询吗?您只想输出添加了 100 年的日期吗?什么?
  • 写类似 queryset.update(end_time=end_time + 1)

标签: python django datetime django-database


【解决方案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)

【讨论】:

    【解决方案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()
    

    希望对你有帮助!

    【讨论】:

    • 虽然此代码可以解决问题,including an explanation 说明如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提出问题的人。请edit您的回答添加解释并说明适用的限制和假设。
    【解决方案3】:

    我会使用dateutil.relativedelta 包的relativedelta 函数,它会为您提供更准确的“n 年前”计算:

    from dateutil.relativedelta import relativedelta
    import datetime
    
    years_ago = datetime.datetime.now() - relativedelta(years=5)
    

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

    【讨论】:

    • 我从未听说过这个软件包(但它已安装在我的系统上)。我不记得安装它,所以知道它是否以某种方式包含在另一个包中?
    • 它是 python-dateutil 的一部分
    • 那是我不记得安装的软件包。虽然找到了我的答案 - 如果尚未安装,它会与 Matplotlib 一起安装。
    • 我今天对此进行了重要的测试。 timedelta(days=365*100) 完全错误。 timedelta(days=365.25*100) 有一些异常值不起作用。 timedelta(days=365.24*100) 更接近,但我发现了几个例外。 relativedelta(years=100) 每次都有效。现在,我必须处理的愚蠢的 '%m%d%y' 日期格式存储每次都会正确(嗯......至少如果他们谈论的日期大于 1917 年。很难从 1916 年到 2016 年)没有其他背景。但 2018 年还没有发生)所以耶!
    • 查看 stackoverflow.com/questions/12433233/… 了解有关 relativedelta 的更多详细信息
    【解决方案4】:

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

    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】:

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

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

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

      【讨论】:

      • 仅供参考,使用具有 timedelta 的 F() 对象,像这样仅在 Django 1.3 或更高版本中可用
      • 这会忽略像 2012-02-29 这样的闰日,如果您需要准确度,最好使用 relativedate() 而不是 timedelta()
      • 如果这适用于 F() 对象,我会感到非常惊讶。数字 365.2425 中的 .2425 是试图考虑闰年的位,尽可能多地使用 F() 对象。
      【解决方案6】:

      使用timedelta。像这样的东西应该可以解决问题:

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

      【讨论】:

        猜你喜欢
        • 2020-11-14
        • 2017-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多