2017-08-09 1 views
1

J'utilise l'exemple ci-dessous pour arrondir le temps dans odoo.Temps rond en python 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)) 

Par exemple:

si start = 07:57:21, finition = 16:25:36, pause = 1 obtenir le résultat 7 heures

si start = 07:57:34 , finish = 16:28:42, pause = 1 obtenir le résultat 8 heures

Première et deuxième fois différent est de 3 minutes mais dans le résultat c'est une heure!

Comment changer tour si le temps total> = 7 heures 30 minutes 01 secondes, je dois résultat 8 dans d'autres solution 7.5 (7 heures et 30 minutes)

+0

'dans une autre solution 7 ou 7.5' ?? Voulez-vous 7 ou 7,5? – qvpham

+0

'rond (7.5) == 8' et' rond (7.4) == 7 == int (7.4) 'et' rond (7.6) == 8 == int (7.6 + 1) ' –

+0

@julivico Désolé mon erreur , Je suis éditer question 7 heures 30 minutes 01 seconde j'ai besoin du résultat 8 dans l'autre solution 7.5 (7 heures et 30 minutes) – Pointer

Répondre

3

Pour "%Y-%m-%d %H:%M:%S" vous pouvez utiliser DEFAULT_SERVER_DATETIME_FORMAT

from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT 

Pour votre problème, vous pouvez utiliser round(x, n). Exemple:

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

Ici, vous devez n = 1 pour 7.5 et n=0 pour le 'standard' round. Vous pouvez vérifier 7.5 avec ((7.5 - 0.5) % 1) == 0 et de le convertir de boolean à int directement avec int()

La solution générale est:

@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)) 
+0

Bel exemple, Est-il possible d'utiliser deux options, par exemple. temps total> = 7 heures 30 minutes 00 seconde = 8 heures et temps total <7 heures 30 minutes 00 seconde = 7.5 – Pointer

+0

Ou 'rount (2 * total_time)/2.0' –

+0

@Anonymous: bon conseil. Mais pour 'round (7.501 * 2) /2.0 = 7.5' qui doit être 8? – qvpham

1
@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 
+0

Tnx pour l'aide, mais après utilisation votre exemple je ne reçois pas le résultat correct. – Pointer