【问题标题】:How do I subtract two dates in Django/Python?如何在 Django/Python 中减去两个日期?
【发布时间】:2011-02-21 03:37:15
【问题描述】:

我正在开发一个小型健身追踪器,以便自学 Django。我想随着时间的推移绘制我的体重,所以我决定使用 Python Google Charts Wrapper。 Google 图表要求您将日期转换为 x 坐标。为此,我想通过从最后一次称重中减去第一次称重,然后使用它来计算 x 坐标(例如,我可以通过结果为 100 并增加x 坐标为每个 y 坐标的结果数。)

无论如何,我需要弄清楚如何将 Django 日期时间对象彼此相减,到目前为止,我在 google 和堆栈中都表现出色。我知道 PHP,但从未掌握过 OO 编程,所以请原谅我的无知。这是我的模型的样子:

class Goal(models.Model):
    goal_weight = models.DecimalField("Goal Weight", 
        max_digits=4, 
        decimal_places=1)
    target_date = models.DateTimeField("Target Date to Reach Goal")
    set_date = models.DateTimeField("When did you set your goal?")
    comments = models.TextField(blank=True)

    def __unicode__(self):
        return unicode(self.goal_weight)

class Weight(models.Model):
    """ Weight at a given date and time. """

    goal = models.ForeignKey(Goal)
    weight = models.DecimalField("Current Weight",
        max_digits=4, 
        decimal_places=1)
    weigh_date = models.DateTimeField("Date of Weigh-In")
    comments = models.TextField(blank=True)

    def __unicode__(self):
        return unicode(self.weight)

    def recorded_today(self):
        return self.date.date() == datetime.date.today()

关于如何在视图中进行的任何想法?非常感谢!

【问题讨论】:

    标签: python django datetime date time


    【解决方案1】:

    请注意,如果两个日期时间具有不同的偏移感知,则减法将不起作用,例如,一个带有 tzinfo,一个没有(原生)。

    【讨论】:

    • 这不是问题的答案。如果您有要补充的内容,请对另一个答案发表评论
    【解决方案2】:

    您可以直接减去日期,这将产生一个datetime.timedelta 对象:

    dt = weight_now.weight_date - weight_then.weight_date
    

    timedelta 对象具有天、秒和微秒的字段。从那里,你可以做适当的数学。例如:

    hours = dt.seconds / 60 / 60    # Returns number of hours between dates
    weeks = dt.days / 7             # number of weeks between dates
    

    【讨论】:

      【解决方案3】:

      Django datetime 对象只是普通的Python datetime objects。当你从另一个中减去一个datetime 时,你会得到一个timedelta 对象。

      如果您希望从 datetime 中减去时间长度,则需要从中减去 timedelta 对象。例如:

      >>> from datetime import datetime, timedelta
      >>> now = datetime.now()
      >>> print now
      2010-05-18 23:16:24.770533
      >>> this_time_yesterday = now - timedelta(hours=24)
      >>> print this_time_yesterday
      2010-05-17 23:16:24.770533
      >>> (now - this_time_yesterday).days
      1
      

      【讨论】:

      • 这很棒。非常感谢...我已经习惯了用字符串来思考,我不认为可以通过减去其他两个对象来生成对象。
      猜你喜欢
      • 2013-03-06
      • 2020-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      • 1970-01-01
      相关资源
      最近更新 更多