2010-09-25 15 views

risposta

10

date() e localtime() entrambi utilizzano il fuso orario locale per il server a meno che sovrascritto; puoi ignorare il fuso orario utilizzato con date_default_timezone_set().

http://www.php.net/manual/en/function.date-default-timezone-set.php

http://us3.php.net/manual/en/function.date.php

http://php.net/manual/en/function.localtime.php

+1

Ma come faccio ad avere il timestamp UTC corrente? – Mark

+0

Perché è necessario il timestamp UTC corrente per convertire il timestamp UTC salvato? – Amber

+0

Ma se lo fai, 'time()' restituisce sempre UTC: http://us2.php.net/manual/en/function.time.php – Amber

49

funzione di PHP strtotime sarà interpretare i codici di fuso orario, come UTC. Se ottieni la data dal database/client senza il codice del fuso orario, ma sai che è UTC, puoi aggiungerla.

Supponendo che si ottiene la data con il codice di timestamp (come "Ven 23 Marzo 2012 22:23:03 GMT-0700 (PDT)", che è ciò che il codice JavaScript ""+(new Date()) dà):

$time = strtotime($dateWithTimeZone); 
$dateInLocal = date("Y-m-d H:i:s", $time); 

O se non lo fai, che rischia da MySQL, quindi:

$time = strtotime($dateInUTC.' UTC'); 
$dateInLocal = date("Y-m-d H:i:s", $time); 
+3

Il secondo snippet di codice è quello che mi serviva per convertire l'output della funzione 'datetime()' di sqlite da UTC a localtime. – fuenfundachtzig

+0

Grazie, hai risparmiato le mie ore. – Abbas

6

in primo luogo, ottenere la data in UTC - hai già fatto che così questo passo sarebbe davvero essere solo una chiamata di database:

Successivamente, impostare il fuso orario locale in PHP:

$timezone = "America/Guayaquil"; 
date_default_timezone_set($timezone); 

Ed ora ottenere l'offset in secondi:

$offset = date('Z', strtotime($utc)); 
print "offset: $offset \n"; 

Infine, aggiungere l'offset per il timestamp intero del datetime originale:

print "LOCAL: " . date('r', strtotime($utc) + $offset) . "\n"; 
+1

O, più concisamente: $ local = date ($ format, strtotime ("$ utc $ offset seconds")); – fijiaaron

+0

data arithmatic non è necessaria se si dispone di fusi orari – fijiaaron

7

L'aritmetica data non è necessaria se si desidera visualizzare lo stesso timestamp in fusi orari diversi:

$format = "M d, Y h:ia"; 
$timestamp = gmdate($format); 

date_default_timezone_set("UTC"); 
$utc_datetime = date($format, $timestamp); 

date_default_timezone_set("America/Guayaquil"); 
$local_datetime = date($format, $timestamp); 
30

risposta

Convertire il datetime UTC in America/Denver

// create a $dt object with the UTC timezone 
$dt = new DateTime('2016-12-12 12:12:12', new DateTimeZone('UTC')); 

// change the timezone of the object without changing it's time 
$dt->setTimezone(new DateTimeZone('America/Denver')); 

// format the datetime 
$dt->format('Y-m-d H:i:s T'); 

Note

time() restituisce il unix timestamp, che è un numero, non ha fuso orario.

date('Y-m-d H:i:s T') restituisce la data nel fuso orario locale corrente.

gmdate('Y-m-d H:i:s T') restituisce la data in UTC

date_default_timezone_set() cambia l'attuale fuso orario locale

cambiare una volta in un fuso orario

// create a $dt object with the America/Denver timezone 
$dt = new DateTime('2016-12-12 12:12:12', new DateTimeZone('America/Denver')); 

// change the timezone of the object without changing it's time 
$dt->setTimezone(new DateTimeZone('UTC')); 

// format the datetime 
$dt->format('Y-m-d H:i:s T'); 

qui potete vedere tutti i fusi orari disponibili

https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

qui sono tutte le opzioni di formattazione

http://php.net/manual/en/function.date.php

Aggiornamento PHP DB fuso orario (in linux)

sudo pecl install timezonedb 
+2

Questa dovrebbe essere la risposta alla domanda sopra .. –

+0

Questo in realtà risponde alla domanda piuttosto che offrire "come ottenere l'ora locale". – ChristoKiwi

1

devo conservare data nel DB in formato UTC, ma poi li mostro per l'utente finale nella loro fuso orario locale

// retrieve 
$d = (new \DateTime($val . ' UTC'))->format('U'); 
return date("Y-m-d H:i:s", $d); 
+0

Com'è questo dfferent dalla risposta data sopra? – Martin

+0

Infatti, se si desidera riscrivere ed espandere l'utilizzo della nuova classe DateTime di PHP, la risposta potrebbe essere un nuovo modo unico per raggiungere il risultato desiderato. – Martin

1

Ecco un modo dritto per convertire l'ora UTC del questionario a TIM locale e. Questo è per un tempo memorizzato in un database ecc., Ad esempio qualsiasi ora. Devi solo trovare la differenza di fuso orario tra l'ora UTC e l'ora locale a cui sei interessato e quindi regolare l'ora UTC aggiunta aggiungendo la differenza.

$df = "G:i:s"; // Use a simple time format to find the difference 
$ts1 = strtotime(date($df)); // Timestamp of current local time 
$ts2 = strtotime(gmdate($df)); // Timestamp of current UTC time 
$ts3 = $ts1-$ts2;    // Their difference 

È quindi possibile aggiungere questa differenza all'ora UTC memorizzata. (al mio posto, di Atene, la differenza è esattamente 05:00:00)

0

Dato un fuso orario locale, come ad esempio 'America/Denver', è possibile utilizzare la classe DateTime per convertire UTC timestamp per la data locale:

$timestamp = *********; 
$date = new DateTime("@" . $timestamp); 
$date->setTimezone(new DateTimeZone('America/Denver')); 
echo $date->format('Y-m-d H:i:s'); 
Problemi correlati