2010-03-24 11 views

Respuesta

85

Usted puede utilizar el objeto de fecha y hora o sus alias de función para esto:

Example (abridged from 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 respecto a los comentarios

pero expecto utilizar este método porque Necesito mostrar la fecha en diferentes zonas horarias como el nosotros er inicio de sesión desde diferentes ubicaciones

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 que necesito para obtener las fechas de cualquier sola zona horaria, entonces sólo se puede procesar correctamente

se almacena el tiempo, ya sea 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.

+0

gracias Gordon pero expecto utilizar este método porque tengo que mostrar la fecha en diferentes zonas horarias como el inicio de sesión de usuario desde diferentes lugares – raki

+0

@raki: por lo que sólo cuando el usuario está conectado - configure date_default_timezone_set() con la zona horaria seleccionada del usuario adecuado. – zerkms

+0

que tampoco es posible ... porque ... en la base de datos necesito obtener las fechas en cualquier zona horaria, entonces solo se puede procesar correctamente – raki

9

Un método aún más simple se parece a esto:

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 in the PHP manual, strtotime() acepta una zona horaria también, sólo hay que añadirlo a su fecha y hora.

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

9

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

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); 
4

DateTime::setTimezone -- date_timezone_set — Sets the time zone for the DateTime object

orientado objeto de estilo

<?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 por procedimientos

<?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 sería:

2000-01-01 00:00:00+12:00 
2000-01-01 01:45:00+13:45 
0
<?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; 
?> 
0

// 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"); 
} 
1

UTC a lo 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'); 

?> 
4

Ninguna de estas respuestas trabajó para mí (me saltaba tratando código que era demasiado voluminosos en tamaño). 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"); 
} 

Por lo tanto, para convertir a los valores predeterminados del servidor, usted acaba de pasar una zona horaria:

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

Convertir desde el servidor por defecto para el usuario, que dejaría el 2º parámetro nulo o en blanco:

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

Y para cambiar a zonas horarias unre RELAClONADAS en el valor predeterminado, que le proporcionará 2 zonas horarias:

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

Parece que funciona muy bien! –

+1

Buena respuesta. Prefiero try catch en lugar de is (empty) para evitar errores ortográficos en la cadena timezone. intente { nuevo DateTimeZone ($ timeZoneSource); } \t catch (Excepción $ e) { $ timeZoneSource = date_default_timezone_get(); } –