2010-10-11 12 views
32

Fondamentalement ce dont j'ai besoin est un script qui, lorsqu'il est fourni avec un fuseau horaire et un fuseau horaire, peut renvoyer l'heure dans un autre fuseau horaire.Convertir l'heure et la date d'un fuseau horaire à l'autre en PHP

Mes principaux problèmes sont les suivants:

  • Où obtenir le décalage horaire de GMT à partir - est-il une base de données publique disponible pour cela?
  • Comment prendre également en compte les différences d'heure d'été (DST).
  • Comment bien emballer le tout dans une classe PHP - ou existe-t-il déjà une telle classe?

Répondre

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

Les exemples ci-dessus seront sortie:

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

trouvé sur DateTime Manual on php.net

EDIT: Comme Pekka a dit: La classe DateTime existe de 5.2 et il vous d'abord trouver sur laquelle des méthodes sont réellement mises en œuvre et laquelle n'existe que depuis 5.3.

+3

me damer le pion, la suppression de la mienne. Il est à noter que DateTime est disponible depuis PHP 5.2 - il y a un patch pour 5.1 mais c'est expérimental –

+0

Yep. datetime est plutôt "nouveau". Même en 5.2 il ne contient pas toutes les fonctions qui sont nécessaires, voulues et mentionnées dans le manuel – ITroubs

+0

Bonne réponse. Ces fonctions prennent automatiquement en charge l'heure d'été, où le simple ajout d'un décalage est maladroit et imprécis. –

-1

Ici, j'utilise cette fonction pour convertir datetime dans un autre fuseau horaire. Pour un meilleur résultat si vous convertissez votre datetime en utc fuseau horaire et ensuite convertir en fuseau horaire requis, alors il est meilleur résultat.

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

Merci.

3

essayer cela, il pourrait aider :)

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