【问题标题】:Django - TimeField differenceDjango - 时间场差异
【发布时间】:2019-05-17 19:53:00
【问题描述】:

我想比较两个时间字段以获得小时和分钟的差异。

class Labor(models.Model):
    id = models.AutoField(primary_key=True)
    start_hour = models.TimeField(null=True)
    end_hour = models.TimeField(null=True)

    def hours(self):
        return self.end_hour - self.start_hour 

但是,如果尝试使用hours 方法,django 会抛出这个异常:

unsupported operand type(s) for -: 'datetime.time' and 'datetime.time'

我希望差异返回给我这样的东西:

10:00 ~ 11:30 = 1:30

11:30 ~ 11:45 = 0:15

我该怎么做?

【问题讨论】:

  • 你期望输出是什么?您需要使用datetime 来比较两个时刻。 Python 的time 不支持- 操作。从“中午”到“中午”的距离是多少?零? 24小时?除非您还具有时间的日期上下文,否则该操作没有意义。
  • 尝试改用models.DateTimeField

标签: django time timefield


【解决方案1】:

首先将字段设置为@Chiefir 提到的 DateTimeField,这将为您提供一个日期时间对象。

那么,

def hours(self):
        c = self.end_time - self.start_time
        print(c.seconds) 
        # Write your logic to convert seconds to hours.

【讨论】:

    【解决方案2】:

    如果您不想将字段设为DateTimeFields,您可以快速计算一下(假设您的时间在同一天)。

    def hours(self):
        end_minutes = self.end_hour.hour*60 + self.end_hour.minute
        start_minutes = self. start_hour.hour*60 + self.start_hour.minute
        return (end_minutes - start_minutes) / 60
    

    这将返回一个浮点数,但您始终可以对该值进行四舍五入。您可能还需要检查以确保 self.end_hour 大于 self.start_hour

    【讨论】:

    • 问题是,在大多数情况下,您不能假设时间是“在同一天”。例如,您可能有一个从 23:00 到 02:00 的时间范围,您希望将其与一天中的某个特定时间进行比较。
    • 如果你需要支持这种情况,那么如果 end_time 小于开始时间,则添加 24*60 使其提前一天。如果您需要支持更多案例,那么显然需要日期时间。
    猜你喜欢
    • 2012-05-21
    • 2011-08-07
    • 1970-01-01
    • 2011-11-19
    • 1970-01-01
    • 1970-01-01
    • 2015-06-27
    • 2017-01-05
    • 2012-01-16
    相关资源
    最近更新 更多