Ciao, ho bisogno di aiuto per capire perché questo sta accadendo. Ho un metodo per tenere traccia 'tempo rimanente' in un programma di eventi:Problema timedelta Python con valori negativi
def get_program_time_budget(self):
return self.estimated_duration-self.get_program_duration()
Tutto bene quando l'estimated_duration> self.get_program_duration(), ma quando questo va nella direzione opposta le cose si fanno divertenti.
I risultati vengono visualizzati per l'utente:
Estimated 11 hours Allocated 10 hours 55 minutes Remaining 5 minutes
Quando il risultato va negativo significa questo:
Estimated 11 hours Allocated 11 hours 5 minutes Remaining -1 day 23 hours 55 minutes
Delle idee come ottenere il risultato -5 minuti?
EDIT: Ecco il formattatore timedelta (Nota: questo è un filtro Django, quindi riceve il valore timedelta come str - ma viene memorizzato come un timedelta):
def format_duration(value):
try:
delim = ':'
toks = value.split(',')
hour = minute = ''
d_string = value.count('day') and toks[0] or ''
h, m, s = d_string and toks[-1].strip().split(delim) or value.split(delim)
try:
hour = int(h)
except:
pass
try:
minute = int(m)
except:
pass
h_string = "%s%s%s" % (hour and hour or '', (hour and ' hour' or ''),(hour and hour > 1 and 's' or '') )
m_string = "%s%s%s" % (minute and minute or '', (minute and ' minute' or ''),(minute and minute > 1 and 's' or ''))
return "%s %s %s" % (d_string, h_string, m_string)
except Exception, e:
logging.error("Error in format_duration -> %s. Duration value=%s" % (e, value))
return ''v
Questo è il modo in cui 'timedelta' funziona per valori negativi. I risultati sono sempre normalizzati in modo che solo il valore 'days' sia negativo. Vorresti negare gli altri campi se il valore dei giorni fosse, ad esempio, -5? –
Sappiamo come sottrarre due timedeltas. Quello che non sappiamo è quale codice hai usato per visualizzare il risultato. Per un consiglio migliore, per favore divulga. –
Se si desidera lavorare con valori di timedelta negativi in modo corretto ("-1 minuto" è solo "-1 minuto" e ** non ** "-1 giorno più 23h59"), è possibile utilizzare il modulo 'relativetimedelta' presente in [dateutil] (http://labix.org/python-dateutil). – florisla