2010-10-11 16 views
32

Fondamentalmente ciò di cui ho bisogno è uno script che, se fornito con un orario e un fuso orario, può restituire l'ora in un altro fuso orario.Convertire ora e data da un fuso orario a un altro in PHP

I miei problemi principali sono:

  • dove trovare il tempo compensato da GMT da - c'è una banca dati pubblica per questo?
  • Come tenere conto anche delle differenze di ora legale (DST).
  • Come racchiudere tutto in una classe PHP - o esiste già una classe di questo tipo?

risposta

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

Gli esempi di cui sopra saranno uscita:

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

trovato su DateTime Manual on php.net

EDIT: Come Pekka ha detto: La classe DateTime esiste da 5.2 a e ci avete primo a trovare quali dei metodi sono stati implementati e quali esistono solo dalla 5.3 in poi.

+3

mi ha battuto al punzone, cancellando la mia. Vale la pena ricordare che DateTime è disponibile da PHP 5.2 - c'è una patch per 5.1 ma è sperimentale –

+0

Sì. datetime è piuttosto "nuovo". Anche in 5.2 non contiene tutte le funzioni necessarie, ricercate e citate nel manuale – ITroubs

+0

Buona risposta. Queste funzioni gestiscono automaticamente anche l'ora legale, dove semplicemente aggiungere un offset è goffo e impreciso. –

-1

Qui utilizzo questa funzione per la conversione di datetime in un altro fuso orario. Per il miglior risultato se si converte il datetime in timezone utc e quindi si converte in timezone richiesto, allora è meglio ottenere risultati.

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; 
} 

Grazie.

3

provare questo, potrebbe aiutare :)

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; 
    } 
Problemi correlati