2011-09-26 17 views
31

Al revisar mis respuestas anteriores, me di cuenta que había código propuesto como this:¿Es un día siempre de 86,400 segundos de epoch?

import time 

def dates_between(start, end): 
    # muck around between the 9k+ time representation systems in Python 
    # now start and end are seconds since epoch 

    # return [start, start + 86400, start + 86400*2, ...] 
    return range(start, end + 1, 86400) 

Al releer esta pieza de código, no pude evitar sentir el toque espectral de Tony the Pony en mi columna vertebral, con suavidad murmurando "segundos" para mis oídos y otras cosas terribles y terribles.

¿Cuándo se rompe la asunción de "un día es 86,400 segundos", para las definiciones de época de 'segundo', si alguna vez? (Asumo funciones tales como time.mktime valores ya la rentabilidad ajustada-DST de Python, por lo que el fragmento anterior también debería funcionar en el horario de verano conmutación días ... espero?)

+3

Vea la [respuesta mejor votada de Jon Skeet] (http://stackoverflow.com/questions/6841333/why-is-subtracting-these-two-times-in-1927-giving-a-strange-result/6841479 # 6841479). –

+0

@Tim Bien, supongo que eso conlleva la ruina de uno de estos enfoques. – badp

Respuesta

21

Al hacer cálculos calendáricos, casi siempre es mejor usar cualquier API que proporcione la plataforma, como el módulo Python calendar, o una biblioteca madura de alta calidad, que escribir código "más simple". Las API de calendario son feas y complicadas, pero eso se debe a que los calendarios del mundo real tienen un comportamiento extraño.

Por ejemplo, si es "10:00:00 AM" en este momento, la cantidad de segundos para "10:00:00 a.m. mañana" podría ser un par de cosas diferentes, dependiendo de la zona horaria (s) está utilizando, si el horario de verano está comenzando o finalizando esta noche, y así sucesivamente.

Cada vez que aparece el constante 86400 en su código, hay una buena posibilidad de que esté haciendo algo que no está del todo bien.

Y las cosas se complican aún más cuando necesita determinar la cantidad de segundos en una semana, un mes, un año, un trimestre, etc. Aprenda a usar esas bibliotecas de calendario.

11

Según Wikipedia,

días son UTC casi siempre 86 400 s de largo, pero debido a "segundos intercalares" son ocasionalmente 86 401 sy pueden tener una longitud de 86 399 s (aunque la última opción no se ha utilizado hasta diciembre de 2010); esto mantiene los días sincronizados con la rotación de la Tierra (o el Tiempo Universal).

Supongo que un segundo de dos saltos podría hacer que el día 86402 dure, si es que alguna vez se usara.

EDITAR de nuevo: segundo me adivino debido a la confusa documentación de python. time.mktime siempre devuelve segundos de época UTC. El rojo. :)

+1

Wikipedia [también afirma] (http://en.wikipedia.org/wiki/Unix_time) que UNIX epoch no cuenta los segundos bisiestos – badp

+2

@badp, el tiempo de la época no cuenta los segundos intercalares, por lo que se mueve antes de "real "tiempo cada vez que hay un segundo intercalar". Entonces, si está convirtiendo de días "reales" a días de época, su día de época no siempre será la misma cantidad de segundos. – Dave

+2

No tiene que esperar el próximo segundo intercalar. Si su zona horaria "admite" el horario de verano, tiene dos días al año que no tienen 24 horas –

9

número de segundos en un día depende de sistema de tiempo que se utiliza, por ejemplo, in POSIX, a day is exactly 86400 seconds by definition:

Como se representa en segundos desde la Época, cada día será explica por exactamente 86.400 segundos.

En UTC, podría haber un segundo intercalar incluido, es decir, un día puede ser 86401 SI segundos (y teóricamente 86399 SI segundos). As of Jun 30 2015, it has happened 26 times.

Si medimos los días por movimiento aparente del Sol, entonces the length of a (solar) day varies through the year by ~16 minutes from the mean.

A su vez es diferente de UT1 que también se basa en la rotación de la Tierra (tiempo solar medio). An apparent solar day can be 20 seconds shorter or 30 seconds longer than a mean solar day. UTC se mantiene dentro de 0.9 segundos de UT1 mediante la introducción de segundos intercalares intercalares ocasionales.

Si define un día con un reloj local, entonces puede ser muy caótico debido a los cambios políticos en la zona horaria. No es correcto suponer que un día puede cambiar solo una hora debido al horario de verano.

Cuestiones relacionadas