2010-01-22 17 views
124

Tengo un timedelta. Quiero los días, horas y minutos de eso, ya sea como una tupla o un diccionario ... No me preocupo.Convierta un timedelta a días, horas y minutos

Debo haber hecho esto una docena de veces en una docena de idiomas a lo largo de los años, pero Python generalmente tiene una respuesta simple para todo, así que pensé en preguntar aquí antes de sacar algunas matemáticas (aunque prolijas).

Mr Fooz plantea un buen punto.

Estoy tratando con "listados" (un poco como los listados de eBay) donde cada uno tiene una duración. Estoy tratando de encontrar el tiempo que queda haciendo when_added + duration - now

¿Estoy en lo cierto al decir que no representaría el horario de verano? Si no, ¿cuál es la forma más simple de agregar/restar una hora?

Respuesta

176

Si usted tiene un valor datetime.timedeltatd, td.days ya le da los "días" que desee. timedelta valores de mantener la fracción del día como segundos (no directamente horas o minutos) por lo que tendrá de hecho tener que realizar sencillas operaciones matemáticas "nauseabundos", por ejemplo:

def days_hours_minutes(td): 
    return td.days, td.seconds//3600, (td.seconds//60)%60 
2

timedeltas tiene un atributo days y seconds .. puede convertirlos usted mismo con facilidad.

17
days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60 

En cuanto a horario de verano, yo creo que lo mejor es convertir ambos objetos a datetime segundos. De esta forma, el sistema calcula DST para usted.

>>> m13 = datetime(2010, 3, 13, 8, 0, 0) # 2010 March 13 8:00 AM 
>>> m14 = datetime(2010, 3, 14, 8, 0, 0) # DST starts on this day, in my time zone 
>>> mktime(m14.timetuple()) - mktime(m13.timetuple())  # difference in seconds 
82800.0 
>>> _/3600            # convert to hours 
23.0 
+1

'mktime()' puede fallar si la zona horaria local puede tener un desplazamiento en diferentes momentos UTC diferentes (muchos lo hacen) - se puede usar 'módulo pytz' para obtener acceso a la base de datos tz en un deteministic portátil camino. Además, la hora local puede ser ambigua (50% de posibilidades de error) - necesita información adicional para eliminar la ambigüedad, por ejemplo, a menudo (no siempre) [las fechas en un archivo de registro son monótonas] (http://stackoverflow.com/a/26221183/4279). Consulte [¿Cómo puedo restar un día de una fecha de Python?] (Http://stackoverflow.com/q/441147/4279) que puede tener que lidiar con problemas similares. – jfs

4

No entiendo

days, hours, minutes = td.days, td.seconds // 3600, td.seconds // 60 % 60 

¿qué tal esto

days, hours, minutes = td.days, td.seconds // 3600, td.seconds % 3600/60.0 

Usted recibe minutos y segundos de un minuto como un flotador.

53

Esto es un poco más compacto, usted obtiene las horas, los minutos y los segundos en dos líneas.

days = td.days 
hours, remainder = divmod(td.seconds, 3600) 
minutes, seconds = divmod(remainder, 60) 
# If you want to take into account fractions of a second 
seconds += td.microseconds/1e6 
+5

es incorrecto si 'td.days' no es cero. Necesitas 'horas + = td.days * 24'. Si desea tener en cuenta fracciones de segundo (OP no lo hace); 'seconds + = td.microseconds/1e6' podría ser utilizado. – jfs

Cuestiones relacionadas