zona horaria date_default_timezone_set cambiar buenos america aires php datetime timezone timestamp

date_default_timezone_set - Conversión de zona horaria en php



timezone america buenos aires (8)

¡Esto funcionó para mí y también es bastante limpio!

function convert_to_user_date($date, $format = ''n/j/Y g:i A'', $userTimeZone = ''America/Los_Angeles'', $serverTimeZone = ''UTC'') { try { $dateTime = new DateTime ($date, new DateTimeZone($serverTimeZone)); $dateTime->setTimezone(new DateTimeZone($userTimeZone)); return $dateTime->format($format); } catch (Exception $e) { return ''''; } } function convert_to_server_date($date, $format = ''n/j/Y g:i A'', $userTimeZone = ''America/Los_Angeles'', $serverTimeZone = ''UTC'') { try { $dateTime = new DateTime ($date, new DateTimeZone($userTimeZone)); $dateTime->setTimezone(new DateTimeZone($serverTimeZone)); return $dateTime->format($format); } catch (Exception $e) { return ''''; } } //example usage $serverDate = $userDate = ''2014-09-04 22:37:22''; echo convert_to_user_date($serverDate); echo convert_to_server_date($userDate);

¿Alguien puede sugerir un método fácil para convertir la fecha y la hora a diferentes zonas horarias en php?


// Convertir la fecha de una zona a otra .. / * $ zone_from = ''Asia / Kolkata'';

$zone_to=''America/Phoenix''; date_default_timezone_set($zone_from); $convert_date="2016-02-26 10:35:00"; echo $finalDate=zone_conversion_date($convert_date, $zone_from, $zone_to); */ function zone_conversion_date($time, $cur_zone, $req_zone) { date_default_timezone_set("GMT"); $gmt = date("Y-m-d H:i:s"); date_default_timezone_set($cur_zone); $local = date("Y-m-d H:i:s"); date_default_timezone_set($req_zone); $required = date("Y-m-d H:i:s"); /* return $required; */ $diff1 = (strtotime($gmt) - strtotime($local)); $diff2 = (strtotime($required) - strtotime($gmt)); $date = new DateTime($time); $date->modify("+$diff1 seconds"); $date->modify("+$diff2 seconds"); return $timestamp = $date->format("Y-m-d H:i:s"); }


Ninguna de estas respuestas funcionó para mí (me salté el código que era excesivamente voluminoso). También creo que es extraño cambiar la zona horaria predeterminada solo para una sola conversión.

Aquí está mi solución:

function changeTimeZone($dateString, $timeZoneSource = null, $timeZoneTarget = null) { if (empty($timeZoneSource)) { $timeZoneSource = date_default_timezone_get(); } if (empty($timeZoneTarget)) { $timeZoneTarget = date_default_timezone_get(); } $dt = new DateTime($dateString, new DateTimeZone($timeZoneSource)); $dt->setTimezone(new DateTimeZone($timeZoneTarget)); return $dt->format("Y-m-d H:i:s"); }

Entonces, para convertir al servidor por defecto, simplemente pasaría una zona horaria:

changeTimeZone("2016-10-24 16:28", "Asia/Tokyo");

Para convertir del servidor predeterminado al usuario, dejaría el segundo parámetro nulo o en blanco:

changeTimeZone("2016-10-24 16:28", "", "Asia/Tokyo");

Y para cambiar a zonas horarias no relacionadas con el valor predeterminado, proporcionaría 2 zonas horarias:

changeTimeZone("2016-10-24 16:28", "America/New_York", "Asia/Tokyo");


Puede usar el objeto datetime o sus alias de función para esto:

Ejemplo ( abreviado de PHP Manual )

date_default_timezone_set(''Europe/London''); $datetime = new DateTime(''2008-08-03 12:35:23''); echo $datetime->format(''Y-m-d H:i:s'') . "/n"; $la_time = new DateTimeZone(''America/Los_Angeles''); $datetime->setTimezone($la_time); echo $datetime->format(''Y-m-d H:i:s'');

Editar con respecto a los comentarios

pero no puedo usar este método porque necesito mostrar la fecha en diferentes zonas horarias como el inicio de sesión del usuario desde diferentes lugares

Eso no es un problema. Cuando un usuario inicia sesión, usted determina su zona horaria y la establece en su objeto DateTime tal como se muestra. Estoy usando un enfoque similar en uno de mis proyectos y funciona como un encanto.

en la base de datos necesito obtener las fechas en cualquier zona horaria única, entonces solo se puede procesar adecuadamente

Almacena la hora como una marca de tiempo o una fecha y hora en una zona horaria. Cuando consulta un campo DateTime, o bien convierte la hora en un objeto DateTime a esta zona horaria o, si su db lo admite, consulta con la zona horaria seleccionada.


UTC a local:

<?php $datetime = date("Y-m-d H:i:s"); $utc = new DateTime($datetime, new DateTimeZone(''UTC'')); $utc->setTimezone(new DateTimeZone(''America/Sao_Paulo'')); echo $utc->format(''Y-m-d H:i:s''); ?>


Un método aún más simple se ve así:

date_default_timezone_set(''Europe/London''); // your user''s timezone $my_datetime=''2013-10-23 15:47:10''; echo date(''Y-m-d H:i:s'',strtotime("$my_datetime UTC"));

Como se describe en el manual de PHP , strtotime () también acepta una zona horaria, solo tiene que agregarla a su fecha y hora.

Le recomiendo que almacene todos sus horarios en UTC porque de esa manera no tendrá problemas con el horario de verano.


DateTime :: setTimezone - date_timezone_set - Establece la zona horaria para el objeto DateTime

Estilo orientado a objetos

<?php $date = new DateTime(''2000-01-01'', new DateTimeZone(''Pacific/Nauru'')); echo $date->format(''Y-m-d H:i:sP'') . "/n"; $date->setTimezone(new DateTimeZone(''Pacific/Chatham'')); echo $date->format(''Y-m-d H:i:sP'') . "/n"; ?>

Estilo de procedimiento

<?php $date = date_create(''2000-01-01'', timezone_open(''Pacific/Nauru'')); echo date_format($date, ''Y-m-d H:i:sP'') . "/n"; date_timezone_set($date, timezone_open(''Pacific/Chatham'')); echo date_format($date, ''Y-m-d H:i:sP'') . "/n"; ?>

Los ejemplos anteriores darán como resultado:

2000-01-01 00:00:00+12:00 2000-01-01 01:45:00+13:45


<?php $time=''6:02''; $dt = new DateTime($time, new DateTimeZone(''America/New_York'')); //echo $dt->format(''Y-m-d H:i:s'') . PHP_EOL; $dt->setTimezone(new DateTimeZone(''Asia/Kolkata'')); echo $dt->format(''H:i'') . PHP_EOL; ?>