2009-02-01 6 views
14

Estoy tratando de tener algunas fechas inteligentes ya que una publicación se ha realizado en mi sitio ("segundos desde, horas desde, semanas desde, etc.") y estoy usando datetime.timedelta diferencia entre utcnow y utc fechado almacenado en la base de datos para una publicación.Timedelta de Python: ¿no puedo simplemente entrar en la unidad de tiempo que quiera el valor de toda la diferencia?

Parece que, de acuerdo con los documentos, tengo que usar el atributo de días Y el atributo de segundos, para obtener las cadenas de fecha de fantasía que quiero.

¿No puedo simplemente entrar en la unidad de tiempo que quiero el valor de toda la diferencia? ¿Me estoy perdiendo de algo?

que sería perfecto si pudiera obtener toda la diferencia en cuestión de segundos.

Respuesta

21

Parece que Python 2.7 ha introducido un método total_seconds(), que es lo que estabas buscando, ¡creo!

15

Puede calcular la diferencia en cuestión de segundos.

total_seconds = delta.days * 86400 + delta.seconds 

No, no te estás perdiendo nada. No proporciona deltas en segundos.

+0

Eso es lo que planeo hacer, pero simplemente no quería ese error en mi código si había algo que no sabía. Gracias. –

+4

Ojalá tuvieran .total_seconds, .total_minutes, etc etc. en timedeltas ... –

+5

Este enfoque, como 'total_seconds()' en Python 2.7, devolverá un resultado incorrecto si los días no tienen 24 horas (por ejemplo, porque de cambios en el horario de verano). – Bruno

5

Sería perfecto si pudiera obtener toda la diferencia en segundos.

Entonces la marca de tiempo simple-viejo-unix proporcionada por el módulo 'tiempo' puede ser más de su gusto.

Personalmente, todavía tengo que convencerme de lo que hay en 'datetime'.

+0

+1 por sugerir una solución que no supone que todos los días tienen 24 horas. – Bruno

5

Como bobince Dicho esto, se puede utilizar marcas de tiempo, así:

# assuming ts1 and ts2 are the two datetime objects 
from time import mktime 
mktime(ts1.timetuple()) - mktime(ts2.timetuple()) 

Aunque yo creo que esto es aún más feo que un simple cálculo de los segundos del objeto timedelta ...

+3

Puede complicar aún más las cosas: 'reducir (float .__ sub__, (mktime (d.utctimetuple()) para d en (TS1, TS2)))' – jfs

+0

@ J.F.Sebastian: pero ¿por qué? – Claudiu

+0

¿Qué pasará si ts1 está en un huso horario y ts2 está en otro? ¿O están en la misma zona horaria pero una está en horario de verano y la otra no? –

Cuestiones relacionadas