2010-10-11 19 views
32

Básicamente lo que necesito es una secuencia de comandos que, cuando se proporciona con una hora y una zona horaria, puede devolver la hora en otra zona horaria.Convertir hora y fecha de una zona horaria a otra en PHP

Mis principales temas son:

  • dónde obtener la compensación de tiempo de GMT desde - ¿Existe una base de datos pública disponible para esto?
  • Cómo tener en cuenta también las diferencias de horario de verano (DST).
  • ¿Cómo se puede incluir todo dentro de una clase de PHP? ¿O existe una clase de este tipo ya disponible?

Respuesta

66
<?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"; 
?> 

Los ejemplos anteriores sería:

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

encontrado en DateTime Manual on php.net

EDIT: Como Pekka dijo: Existe la clase DateTime de 5.2 en y hay que primero tiene que encontrar cuál de los métodos se implementa realmente y cuál solo existe desde 5.3 en adelante.

+3

me ganó de mano, la supresión de la mía. Vale la pena mencionar que DateTime está disponible desde PHP 5.2 - hay un parche para 5.1 pero es experimental –

+0

Sí. datetime es bastante "nuevo". Incluso en 5.2 no contiene todas las funciones necesarias, deseadas y mencionadas en el manual – ITroubs

+0

Buena respuesta. Estas funciones también manejan automáticamente el horario de verano, donde simplemente agregar un desplazamiento es torpe e inexacto. –

-1

Aquí uso esta función para convertir la fecha y hora en otra zona horaria. Para obtener el mejor resultado si convierte su fecha y hora en la zona horaria utc y luego la convierte en la zona horaria requerida, entonces es mejor resultado para ella.

function ConvertTimezoneToAnotherTimezone($time, $currentTimezone, $timezoneRequired) { 
    $dayLightFlag = false; 
    $dayLgtSecCurrent = $dayLgtSecReq = 0; 
    $system_timezone = date_default_timezone_get(); 
    $local_timezone = $currentTimezone; 
    date_default_timezone_set($local_timezone); 
    $local = date("Y-m-d H:i:s"); 
    /* Uncomment if daylight is required */ 
    //  $daylight_flag = date("I", strtotime($time)); 
    //  if ($daylight_flag == 1) { 
    //   $dayLightFlag = true; 
    //   $dayLgtSecCurrent = -3600; 
    //  } 
    date_default_timezone_set("GMT"); 
    $gmt = date("Y-m-d H:i:s "); 

    $require_timezone = $timezoneRequired; 
    date_default_timezone_set($require_timezone); 
    $required = date("Y-m-d H:i:s "); 
    /* Uncomment if daylight is required */ 
    //  $daylight_flag = date("I", strtotime($time)); 
    //  if ($daylight_flag == 1) { 
    //   $dayLightFlag = true; 
    //   $dayLgtSecReq = +3600; 
    //  } 

    date_default_timezone_set($system_timezone); 

    $diff1 = (strtotime($gmt) - strtotime($local)); 
    $diff2 = (strtotime($required) - strtotime($gmt)); 

    $date = new DateTime($time); 

    $date->modify("+$diff1 seconds"); 
    $date->modify("+$diff2 seconds"); 

    if ($dayLightFlag) { 
     $final_diff = $dayLgtSecCurrent + $dayLgtSecReq; 
     $date->modify("$final_diff seconds"); 
    } 

    $timestamp = $date->format("Y-m-d H:i:s "); 

    return $timestamp; 
} 

Gracias.

3

probar esto, podría ayudar :)

function converToTz($time="",$toTz='',$fromTz='') 
    { 
     // timezone by php friendly values 
     $date = new DateTime($time, new DateTimeZone($fromTz)); 
     $date->setTimezone(new DateTimeZone($toTz)); 
     $time= $date->format('Y-m-d H:i:s'); 
     return $time; 
    } 
Cuestiones relacionadas