python odoo 中的循环时间

Round time in python odoo

我在 odoo 中使用下面的例子来表示循环时间。

@api.one
@api.depends('start','finish','pause')
def total(self):
    for rec in self:
        time1 = datetime.strptime(rec.start, "%Y-%m-%d %H:%M:%S")
        time2 = datetime.strptime(rec.finish, "%Y-%m-%d %H:%M:%S")
        rec.total_time = round(((time2 - time1).seconds / float(60*60) - self.pause))

例如:

if start = 07:57:21 , finish = 16:25:36, pause = 1 get result 7 小时

if start = 07:57:34 , finish = 16:28:42, pause = 1 get result 8 小时

第一次和第二次相差3分钟,但结果是一个小时!

如果总时间 >= 7 小时 30 分 01 秒,我需要在其他解决方案 7.5(7 小时 30 分钟)中得到结果 8

对于 "%Y-%m-%d %H:%M:%S" 你可以使用 DEFAULT_SERVER_DATETIME_FORMAT

from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT

对于您的问题,您可以使用 round(x, n)。示例:

round(7.4, 0) = 7
round(7.5, 0) = 8
round(7.5, 1) = 7.5

这里你需要 n = 1 代表 7.5n=0 代表 'standard' round。您可以使用 ((7.5 - 0.5) % 1) == 0 检查 7.5 并直接使用 int()

将其从 boolean 转换为 int

一般的解决方法是:

@api.one
@api.depends('start','finish','pause')
def total(self):
    for rec in self:
        time1 = datetime.strptime(rec.start, DEFAULT_SERVER_DATETIME_FORMAT)
        time2 = datetime.strptime(rec.finish, DEFAULT_SERVER_DATETIME_FORMAT)
        total_time = (time2 - time1).seconds / float(60*60) - self.pause
        rec.total_time = round(total_time, int(((total_time - 0.5) % 1) == 0))
@api.one
@api.depends('start','finish','pause')
def total(self):
    for rec in self:
        time1 = datetime.strptime(rec.start, DEFAULT_SERVER_DATETIME_FORMAT)
        time2 = datetime.strptime(rec.finish, DEFAULT_SERVER_DATETIME_FORMAT)
        total_time = (time2 - time1).seconds / float(60*60) - self.pause
        total_time = 2*total_time
        if 2*total_time%1 <=0.5 :
            res = round(total_time)
        else :
            res = round(2*total_time)
        rec.total_time = res