PHP date (); con la zona horaria?

Así que he comprobado la lista de zonas horarias compatibles en PHP y me preguntaba cómo podría incluirlas en la fecha (); ¿función? ¡Gracias!

No quiero una zona horaria predeterminada, cada usuario tiene su zona horaria almacenada en la base de datos, tomo esa zona horaria del usuario y la uso. ¿Cómo? Sé cómo sacarlo de la base de datos, no cómo usarlo.

Para tal tarea, realmente deberías estar usando la clase DateTime de PHP. Por favor, ignore todas las respuestas que le aconsejan usar date () o date_set_time_zone, es simplemente malo y obsoleto.

Usaré un pseudocódigo para demostrarlo, así que trate de ajustar el código para adaptarlo a sus necesidades.

Suponiendo que la variable $ tz contiene el nombre de la cadena de una zona horaria válida y la variable $ timestamp contiene la marca de tiempo que desea formatear de acuerdo con la zona horaria, el código se vería así:

$tz = 'Europe/London'; $timestamp = time(); $dt = new DateTime("now", new DateTimeZone($tz)); //first argument "must" be a string $dt->setTimestamp($timestamp); //adjust the object to correct timestamp echo $dt->format('dmY, H:i:s'); 

La clase DateTime es potente, y para comprender todas sus capacidades, debería dedicar parte de su tiempo a leer sobre ella en php.net. Para responder a su pregunta por completo, sí, puede ajustar dinámicamente el parámetro de zona horaria (en cada iteración mientras lee desde db, puede crear un nuevo objeto DateTimeZone ()).

Si entendí correcto, primero debe establecer la zona horaria como:

 date_default_timezone_set('UTC'); 

Y que puedes usar la función de fecha:

 // Prints something like: Monday 8th of August 2005 03:12:46 PM echo date('l jS \of FY h:i:s A'); 

Utilice la clase DateTime en su lugar, ya que admite zonas horarias. El equivalente de DateTime de date() es DateTime::format .

Un contenedor extremadamente útil para DateTime es Carbon , definitivamente échale un vistazo.

Querrá almacenar en la base de datos como UTC y convertir en el nivel de la aplicación.

Le gustaría esto:

 date_default_timezone_set('America/New_York'); 

Prueba esto. Puede pasar la marca de tiempo de unix o la cadena de fecha y hora

 public static function convertToTimezone($timestamp, $fromTimezone, $toTimezone, $format='Ymd H:i:s') { $datetime = is_numeric($timestamp) ? DateTime::createFromFormat ('U' , $timestamp, new DateTimeZone($fromTimezone)) : new DateTime($timestamp, new DateTimeZone($fromTimezone)); $datetime->setTimezone(new DateTimeZone($toTimezone)); return $datetime->format($format); } 

La respuesta anterior me hizo saltar algunos aros / atracos, por lo que solo publiqué el código del limpiador que funcionó para mí:

 $myTimestamp = 123456789; $dt = new DateTime(); $dt->setTimezone(new DateTimeZone('America/New_York')); $dt->setTimestamp($myTimestamp); return $dt->format('F j, Y @ G:i'); 

Creé esta función muy sencilla y funciona a las mil maravillas:

 function ts2time($timestamp,$timezone){ /* input: 1518404518,America/Los_Angeles */ $date = new DateTime(date("d FYH:i:s",$timestamp)); $date->setTimezone(new DateTimeZone($timezone)); $rt=$date->format('M d, Y h:i:s a'); /* output: Feb 11, 2018 7:01:58 pm */ return $rt; } 

Puede reemplazar el valor de la base de datos en la función date_default_timezone_set, date_default_timezone_set (SOME_PHP_VARIABLE); pero solo necesita cuidar los valores exactos relevantes para las zonas horarias.