2011-01-27 15 views

risposta

87

time restituisce un timestamp UNIX, che è indipendente dal fuso orario. Poiché un timestamp UNIX indica i secondi dal 1970 UTC si potrebbe dire che è UTC, ma in realtà non ha fuso orario.


Per essere veramente chiari, un timestamp UNIX è lo stesso valore in tutto il mondo in qualsiasi momento. Al momento della scrittura è 1296096875 a Tokyo, Londra e New York. Per convertire questo in un tempo "leggibile", devi specificare il fuso orario in cui desideri visualizzarlo. 1296096875 a Tokyo è 2011-01-27 11:54:35, a Londra è 2011-01-27 02:54:35 ea New York è 2011-01-26 21:54:35.

In effetti si sta di solito si tratta di (un mix di) questi concetti quando si maneggiano i tempi:

  • punti assoluti nel tempo, che mi piace fare riferimento a come punti nella storia umana
  • ora locale, che mi piace fare riferimento a come tempo di orologio da parete
  • timestamp completi in qualsiasi formato che esprimono un assoluto punto nella storia umana
  • incompleta tempo dell'orologio di parete locale

tempo I dettagli simili:

-------+-------------------+-------+--------+----------------+------> 
     |     |  |  |    | 
Dinosaurs died  Jesus born Y2K Mars colonised  ??? 

(non in scala)

Un punto assoluto su questa linea può essere espressa come :

  • 1.296.096,875 mila
  • 27 Gennaio 2011 02:54:35 Europe/London

Entrambi i formati esprimere lo stesso punto in assoluto nel tempo in diverse notazioni.Il primo è un semplice contatore è iniziata all'incirca qui:

      start of UNIX epoch 
            | 
-------+-------------------+------++--------+----------------+------> 
     |     |  |  |    | 
Dinosaurs died  Jesus born Y2K Mars colonised  ??? 

Quest'ultima è molto più complicata ma ugualmente valido ed espressivo contatore è iniziata all'incirca qui:

   start of Gregorian calendar 
          | 
-------+-------------------+-------+--------+----------------+------> 
     |     |  |  |    | 
Dinosaurs died  Jesus born Y2K Mars colonised  ??? 

timestamp UNIX sono semplici. Sono un contatore iniziato in un momento specifico e che continua ad aumentare di 1 ogni secondo (per la definizione ufficiale di cosa sia un secondo). Immagina che qualcuno a Londra abbia iniziato un cronometro alla mezzanotte del 1 gennaio 1970, che è ancora in corso. Questo è più o meno ciò che è un timestamp UNIX. Tutti usano lo stesso valore di quel cronometro.

Il tempo di orologio da parete umano leggibile è più complicato, ed è anche più complicato dal fatto che è abbreviato e parti di esso omesse nell'uso quotidiano. 02:54:35 significa quasi nulla sulla timeline nella foto sopra. 27 gennaio 2011 02:54:35 è già molto più specifico, ma potrebbe comunque significare una varietà di punti diversi su questa linea. "Quando l'orologio ha colpito 02:54:35 il 27 gennaio 2011 a Londra, Europa" ora è finalmente un punto assoluto inequivocabile su questa linea, perché c'è solo un punto nel tempo in cui questo era vero.

Quindi, i fusi orari sono un "modificatore" di "tempi dell'orologio a muro" che sono necessari per esprimere un punto temporale unico e univoco utilizzando una notazione calendario e ora/minuto/secondo. Senza un fuso orario un timestamp in tale formato è ambiguo, perché l'orologio ha colpito 02:54:35 il 27 gennaio 2011 in tutti i paesi del mondo in momenti diversi.

Un timestamp UNIX intrinsecamente non presenta questo problema.


convertire da un timestamp UNIX a un tempo di orologio da parete leggibile, è necessario specificare quale fuso orario vuoi l'ora visualizzata. Per convertire da tempo orologio da parete per un timestamp UNIX, è necessario conoscere il fuso orario in cui dovrebbe essere l'ora dell'orologio a muro. È necessario includere il fuso orario ogni volta con ciascuna di tali conversioni oppure impostare il fuso orario predefinito da utilizzare con date_default_timezone_set.

+1

Non è quello che dici essere in conflitto con se stesso? "time restituisce un timestamp UNIX, che è indipendente dal fuso orario ..." e quindi "Sarà calcolato in base al fuso orario impostato, quindi, se il fuso orario è impostato in modo errato, il timestamp sarà disattivato ..." Dissonanza cognitiva. – jayarjo

+0

Il formato * * di un timestamp UNIX è indipendente dal fuso orario. Un timestamp UNIX esprime un punto unico e assoluto nella storia umana. Tuttavia, per arrivare a questo timestamp * da "wall clock time" * (ad esempio "26 gennaio 2011 21:54:35"), è necessario prendere in considerazione il fuso orario di questo orologio a muro.Ammetto che questo è espresso in qualche modo poco chiaro. – deceze

+2

Ho riscritto e chiarito * un po '*. :) – deceze

4

http://us3.php.net/time

"restituisce l'ora corrente misurata nel numero di secondi dalla Unix Epoch (1 gennaio 1970 00:00:00 GMT)."

Quindi credo che la risposta alla tua domanda sia sì.

+2

come può rispondere a una sì una o domanda ??? – yehuda

+1

Ricontrolla il titolo. –

+0

Sì, hai ragione. Scusate. +1 invece. – yehuda

2

Da the documentation

restituisce l'ora corrente misurata nel numero di secondi dalla Unix Epoch (1 Gennaio 1970 00:00:00 GMT).

15

Dal PHP 5.1.0 (quando sono state riscritte le funzioni di data/ora), ogni chiamata a una funzione data/ora genererà un E_NOTICE se il fuso orario non è valido, e/o un messaggio E_WARNING se si utilizzano le impostazioni di sistema o la variabile di ambiente TZ.

Quindi, al fine di ottenere un timestamp UTC si dovrebbe verificare ciò che il fuso orario corrente è e lavorare fuori di quella o basta usare:

$utc_str = gmdate("M d Y H:i:s", time()); 
$utc = strtotime($utc_str); 
+0

sia time() che strtotime (gmdate ("M d Y H: i: s", time())) restituiscono lo stesso risultato: - \ –

+0

Essi * possono * a seconda di come si imposta il fuso orario, ma non sempre. Vedi questi per ulteriori chiarimenti: http://us3.php.net/manual/en/function.gmdate.php – Julian

Problemi correlati