0

我的 django 模型中有一个 TimeField() 。我想将此记录的总和转换为小时。

这是我认为的实际代码:

hours_week_decimal = Timesheet.objects.filter(owner = request.user.pk, week = datetime.datetime.now().isocalendar()[1]).aggregate(total=Sum('working_hour')) # this method return a dict of decimal
total_hours_week = convertDecimalToHours(hours_week_decimal)

及相关功能:

def convertDecimalToHours(times):
    total_time = 0
    for k, v in times.items():
        total_time += int(v)
    print("type: {} - value: {}".format(type(total_time), total_time))

这让我回来了:

 type: int - value: 166000

我有两个小时:

 Monday (08:30) and Tuesday(08:30)

它一定还给了我"17:00"

希望你能帮助我解决这个问题:)

4

2 回答 2

1

问题是 30m+30m = 60m 是的,是 1h,但是您希望计算器能够理解您想要 30+30 = 1h 所以,在您的情况下,您必须将 8:30 显式转换为 8.5

用几行代码扩展您的示例的一种快速但不优雅的方法可以是:

  • 将您的整数转换为字符串。
  • 去掉小时(位置 0 和 1)并乘以 60 以获得分钟。
  • 将此结果与分钟相加(位置 2 和 3)

对您拥有的每个 TimeField 执行此操作后,将所有转换为分钟的时间相加,然后以小时为单位重新转换。

在您的示例中:

def convertDecimalToHours(times):
total_time = 0
for k, v in times.items():
    tmp_time = str(int(v))
    minutes = int(tmp_time[2:4]) + int(tmp_time[0:2])*60
    total_time += minutes / 60 # Now your 8:30 is 8.5
print("type: {} - value: {}".format(type(total_time), total_time))

您在这里的输出将是 17。我建议您将此作为示例来理解这个概念,而不是作为解决问题的打包解决方案。

于 2018-11-27T11:01:57.317 回答
0

感谢您的回答,

在我的数据库中,我有一列类型为“时间”的列。该值的存储方式如下:08:30:00.000000。

使用我之前的代码,时间变量(传入参数)是这样的:

{'total':十进制('166000.000000')}

于 2018-11-27T10:34:47.163 回答