2011-09-26 2 views
31

Durante la revisione mie risposte precedenti, ho notato che avevo codice proposto come this:È un giorno sempre 86.400 secondi di epoca?

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) 

Quando rileggendo questo pezzo di codice, non ho potuto fare a meno di sentire il tocco spettrale di Tony the Pony alla spina dorsale, con delicatezza mormorando "secondi bisestili" alle mie orecchie e ad altre cose terribili e terribili.

Quando termina l'interruzione dell'assunzione "un giorno è 86.400 secondi", per le definizioni di epoca di "secondo", se mai? (Suppongo funzioni come time.mktime valori già return DST-adjusted di Python, in modo che il frammento di cui sopra dovrebbe funzionare anche su DST commutazione giorni ... spero?)

+3

See Jon Skeet del [Top votato risposta mai] (http://stackoverflow.com/questions/6841333/why-is-subtracting-these-two-times-in-1927-giving-a-strange-result/6841479 # 6.841.479). –

+0

@Tim Ok, immagino che quasi tutti gli incantesimi siano destinati a un simile approccio. – badp

risposta

21

Ogni volta che si eseguono calcoli di calendari, è quasi sempre meglio utilizzare qualsiasi API fornita dalla piattaforma, come il modulo calendar di Python o una libreria di alta qualità matura, piuttosto che scrivere codice "più semplice". Le API di Calendar sono brutte e complicate, ma perché i calendari del mondo reale hanno un comportamento strano.

Ad esempio, se è "10:00:00 AM" ora, quindi il numero di secondi a "10:00:00 di domani" potrebbe essere un paio di cose diverse, a seconda di quale fuso orario (s) stai usando, se l'ora legale inizia o termina stasera e così via.

Ogni volta che la costante 86400 appare nel codice, ci sono buone possibilità che tu stia facendo qualcosa che non è giusto.

E le cose diventano ancora più complicate quando è necessario determinare il numero di secondi in una settimana, un mese, un anno, un quarto e così via. Impara a usare quelle librerie di calendari.

11

Secondo Wikipedia,

giorni UTC sono quasi sempre 86 400 s di lunghezza, ma a causa di "secondi intercalari" sono occasionalmente 86 401 s e potrebbe essere 86 399 s lungo (anche se l'ultima opzione non è mai stata utilizzata a dicembre 2010); questo mantiene i giorni sincronizzati con la rotazione della Terra (o Tempo Universale).

Mi aspetto che un secondo salto doppio potrebbe in effetti rendere il giorno 86402 lungo, se questo dovesse mai essere utilizzato.

EDIT di nuovo: secondo indovinato a causa di confondere la documentazione di Python. time.mktime restituisce sempre i secondi dell'ora UTC. Quello rosso. :)

+1

Wikipedia [afferma anche] (http://en.wikipedia.org/wiki/Unix_time) che l'epoca UNIX non conta secondi bisestili – badp

+2

@badp, il tempo Epoch non conta i secondi bisestili, quindi va avanti "reale" "tempo ogni volta che c'è un secondo salto. Quindi, se stai convertendo da giorni "reali" a giorni d'epoca, il tuo giorno d'epoca non sarà sempre lo stesso numero di secondi. – Dave

+2

Non devi aspettare il secondo istante successivo. Se il fuso orario "supporta" l'ora legale, riceverai due giorni all'anno che non hanno 24 ore –

9

Numero di secondi in un giorno dipende dal sistema volta che si utilizza per esempio, in POSIX, a day is exactly 86400 seconds by definition:

come rappresentato in secondi da epoch, ogni giorno sarà valutate con esattamente 86,4 mila secondo.

in UTC, ci potrebbe essere un secondo intercalare incluso vale a dire, un giorno può essere 86401 SI secondi (e teoricamente 86399 SI secondi). As of Jun 30 2015, it has happened 26 times.

Se misuriamo i giorni per moto apparente del Sole, quindi the length of a (solar) day varies through the year by ~16 minutes from the mean.

A sua volta è diverso da UT1 che si basa anche sulla rotazione della Terra (tempo solare medio). An apparent solar day can be 20 seconds shorter or 30 seconds longer than a mean solar day. UTC viene mantenuto entro 0,9 secondi dall'UT1 dall'introduzione di saltuari secondi intercalari.

Se si definisce un giorno in base all'orologio locale, potrebbe essere molto caotico a causa di cambiamenti politici bizzarri nel fuso orario. Non è corretto presumere che un giorno può cambiare solo di un'ora a causa dell'ora legale.