2010-09-25 28 views
22

Estoy almacenando la UTC para llevarlo a la base de datos usando:data Convertir UTC a la hora local en PHP

$utc = gmdate("M d Y h:i:s A"); 

y luego quiero convertir la fecha UTC salvado a la hora local del cliente.

¿Cómo puedo hacer eso?

Gracias

Respuesta

10

date() y localtime() ambos utilizan la zona horaria local del servidor a no ser anulado; puede anular la zona horaria utilizada 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

Pero, ¿cómo obtengo la indicación de fecha y hora UTC actual? – Mark

+0

¿Por qué necesita la marca de tiempo UTC actual para convertir la marca de tiempo UTC guardada? – Amber

+0

Pero si lo hace, 'time()' siempre devuelve UTC: http://us2.php.net/manual/en/function.time.php – Amber

49

función de PHP strtotime interpretará los códigos de zona horaria, como UTC. Si obtiene la fecha de la base de datos/cliente sin el código de zona horaria, pero sabe que es UTC, puede agregarla.

Suponiendo que se obtiene de la fecha con el código de marca de tiempo (como "Vie Mar 23 de 2012 22:23:03 GMT-0700 (PDT)", que es lo que da ""+(new Date()) código Javascript):

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

O si no lo hace, que es probablemente de MySQL, y luego:

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

El segundo fragmento de código es lo que necesitaba para convertir la salida de la función 'datetime()' de sqlite de UTC a localtime. – fuenfundachtzig

+0

Gracias, me salvaste las horas. – Abbas

6

en primer lugar, obtener la fecha en UTC - que ya ha hecho esto por lo que este paso sería realmente sólo ser una llamada de base de datos:

$timezone = "UTC"; 
date_default_timezone_set($timezone); 

$utc = gmdate("M d Y h:i:s A"); 
print "UTC: " . date('r', strtotime($utc)) . "\n"; 

A continuación, establezca su zona horaria local en PHP:

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

Y ahora conseguir el desplazamiento en segundos:

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

Por último, añadir el desplazamiento a la marca de tiempo entero de su fecha y hora originales:

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

O, de forma más concisa: $ local = date ($ format, strtotime ("$ utc $ offset seconds")); – fijiaaron

+0

fecha aritmático no es necesario si tiene zonas horarias – fijiaaron

7

La aritmética de la fecha no es necesaria si solo desea mostrar la misma marca de tiempo en diferentes zonas horarias:

$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

respuesta

convierten la fecha y hora UTC a América/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'); 

Notas

time() devuelve el unix timestamp, que es un número, no tiene zona horaria.

date('Y-m-d H:i:s T') devuelve la fecha en la zona horaria local actual.

gmdate('Y-m-d H:i:s T') devuelve la fecha en UTC

date_default_timezone_set() cambia la localización actual zona horaria

cambiar una vez en una zona horaria

// 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'); 

aquí se puede ver todas las zonas horarias disponibles

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

aquí están todas las opciones de formato

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

Actualización de PHP zona horaria DB (en Linux)

sudo pecl install timezonedb 
+2

Esta debería ser la respuesta a la pregunta anterior. –

+0

Esto realmente responde a la pregunta en lugar de ofrecer "cómo obtener la hora local". – ChristoKiwi

1

almaceno fecha en la base de datos en formato UTC, pero luego les muestro al usuario final en su zona horaria local

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

¿Cómo se diferencia esto de la respuesta dada anteriormente? – Martin

+0

De hecho, si quisiera reescribir y expandir el uso de la nueva clase PHP DateTime, su respuesta podría ser una nueva forma única de lograr el resultado deseado. – Martin

1

Aquí está una manera directa de convertir la hora UTC del interrogador a tim local mi. Esto es por un tiempo almacenado en una base de datos, etc., es decir, cualquier tiempo. Solo tiene que encontrar la diferencia horaria entre la hora UTC y la hora local en la que está interesado y luego ajustar el tiempo UTC almacenado para agregarle la diferencia.

$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 

Puede agregar esta diferencia a la hora UTC almacenada. (En mi lugar, Atenas, la diferencia es exactamente 05:00:00)

0

Dada una zona horaria local, como 'América/Denver', puede utilizar la clase DateTime para convertir fecha y hora UTC a la fecha local:

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