2011-10-15 13 views
5

PHP manuale indica che time() rendimenti  " la corrente timestamp Unix "  ­ e microtime() restituisce la corrente timestamp  " Unix con microsecondi " ʙ.È tempo() garantito essere informato al secondo?

Tuttavia, queste funzioni sono garantite da come that of strictly conforming POSIX.1 systems?

In particolare, i secondi intercalati vengono inseriti in modo che l'output di time() e hairsp; | & hairsp; ­ microtime() salto all'indietro di 1 secondo alla partenza del giorno successivo, (che è il anche alla fine del secondo intercalare,) dandoci ripetuto Valori ritorno — al contrario di fresche valori unici — in tutto il interezza del primo secondo di quel giorno successivo?

Ad esempio, se si esegue il polling time() & hairsp; | & hairsp; ­ microtime() ogni microsecondo nell'arco del 1998 & # xfeff; -12 & # xfeff; -31 e 1999 & # xfeff; -01 & # xfeff; -01, ci sarebbero due occorrenze di ogni valore compreso tra 915 e hairsp; & # xfeff; 148 & hairsp ; & # xfeff; 800 & # xff1c; & # xfeff; & # xff1d; x & # xff1c; 915 & hairsp; & # xfeff; 148 & hairsp; & # xfeff; 801?

+3

Quanti secondi hai trascorso su questo? –

+0

@Ash: carino ma informativo ... haha ​​ – prodigitalson

+3

@Ash intendi secondi SI o secondi solari? – Pacerier

risposta

8

PHP è un linguaggio server. La funzione time() si risolverà all'ora di sistema di quel server. Se il server sta eseguendo un demone NTP, sarà consapevole del secondo intercalare e si adeguerà di conseguenza. PHP non ne è a conoscenza, ma il sistema lo fa.

1

time() restituisce solo l'UNIX-Timestamp. Ciò significa che non è influenzato dai secondi bisestili (e simili), perché non perderai mai il tempo, solo perché qualcuno lo ha deciso. Sono interessate solo le rappresentazioni testuali (ad esempio create utilizzando date()).

+1

Credo che la domanda dovrebbe essere; la data() è secondo al secondo? – Gerben

+0

Sì, ma non lo è :) – KingCrunch

+0

@King Sto fraintendendo qualcosa, perché il tempo UNIX è influenzato dai secondi bisestili: http://en.wikipedia.org/wiki/Unix_time – Pacerier

10

Il timestamp UNIX, come si ottiene da time() in PHP, è una bestia particolare.

Mi ci è voluto molto tempo per capirlo, ma quello che succede è che il timestamp aumenta durante il secondo intercalare, e quando il secondo intercalare è finito, il timestamp (ma non l'UTC!) Salta indietro di un secondo.

Questo ha alcune implicazioni importanti:

  • Puoi sempre accuratamente convertire da UTC a un timestamp UNIX
  • Puoi non sempre (per tutti i punti nel tempo) Conversione da timestamp UTC
  • Il timestamp di Unix non è contiguo, vale a dire fa un passo indietro. (O in alternativa, rimane invariato senza aumentare per 2 secondi.)
  • Se si verifica un errore di conversione durante la conversione da UNIX all'ora UTC, l'errore sarà al massimo di 2 secondi. (Ciò significa che si potrebbe ottenere il giorno sbagliato però.)
  • In retrospect, il timestamp Unix apparirà lineare. Ciò significa che se si memorizzano i dati delle serie temporali e non si è interessati a un solo secondo o due all'anno che vengono rappresentati in modo errato, è possibile considerare contigui i dati memorizzati con data e ora.

Soluzioni alternative

Che cosa succede se il timestamp Unix né saltato Backed bruscamente né è rimasto lo stesso per 2 secondi? Questo è esattamente ciò che Google ha fatto accadere per i loro server. La loro soluzione è stata a slowly skew the time merely milliseconds at a time per un lungo periodo di tempo, per rendere il secondo passaggio bisestile praticamente invisibile alle applicazioni. (Per quanto riguarda le applicazioni e i sistemi operativi sui server di Google, i secondi bisestili non vengono più inseriti da the IERS.)

+0

+1 solo per il collegamento alla soluzione di Google. –

+0

@Prof., La risposta di Angelom sarebbe più accurata? Che dipende dalla piattaforma? – Pacerier

+0

@Pacerier, non esattamente la * piattaforma *, ma PHP dipende dal momento in cui il sistema operativo deve essere configurato correttamente. –

Problemi correlati