2009-09-18 2 views
5

Es gibt eine Menge Informationen über Zeitzonenanpassungen in PHP, aber ich habe keine Antwort gefunden, was genau ich wegen all dem Rauschen machen möchte.Anpassen der Zeitzone in PHP mit DateTime/DateTimeZone

Angesichts einer Zeit in einer Zeitzone, ich möchte es in die Zeit in einer anderen Zeitzone konvertieren.

This ist im Wesentlichen, was ich tun möchte, aber ich muss in der Lage sein, es nur mit den integrierten PHP-Bibliotheken, nicht PEAR Date zu tun.

Dies ist, was ich getan habe, aber es scheint immer mir zu geben, den Offset relativ zu GMT:

$los_angeles_time_zone = new DateTimeZone('America/Los_Angeles'); 
$hawaii_time_zone = new DateTimeZone('Pacific/Honolulu'); 

$date_time_los_angeles = new DateTime('2009-09-18 05:00:00', $los_angeles_time_zone); 
printf("LA Time: %s<br/>", $date_time_los_angeles->format(DATE_ATOM)); 

$time_offset = $hawaii_time_zone->getOffset($date_time_los_angeles); 
printf("Offset: %s<br/>", $time_offset); 

Dies ist die Ausgabe:

LA Time: 2009-09 -18T05: 00: 00-07: 00
Offset: -36000

ich 3 Stunden erwartet wurde (10.800 Sekunden). aber das '-7: 00' Ding sagt mir, dass es alles relativ zu GMT hält, was vielleicht erklärt, warum es mir den "absoluten" Offset gibt.

Wie bekomme ich nur den Versatz zwischen den beiden Zeitzonen ohne all diese GMT hoohah?

Danke.

UPDATE:

Ich fiel mir ein, dass ich dies tun könnte und bekommen, was ich will:

$date_time_los_angeles = new DateTime('2009-09-18 05:00:00', $los_angeles_time_zone); 
printf("LA Time: %s<br/>", $date_time_los_angeles->format(DATE_ATOM)); 

$date_time_hawaii = new DateTime('2009-09-18 05:00:00', $hawaii_time_zone); 
printf("Hawaii Time: %s<br/>", $date_time_hawaii->format(DATE_ATOM)); 


$time_offset = $los_angeles_time_zone->getOffset($date_time_los_angeles) - $hawaii_time_zone->getOffset($date_time_los_angeles); 
printf("Offset: %s<br/>", $time_offset); 

Aber es fühlt sich mir peinlich. Wer weiß einen saubereren Weg, es zu tun?

Antwort

8

Hier sind ein paar Funktionen, die die DateTime-Klassen verwenden. Der erste gibt die Differenz in Sekunden zwischen zwei Zeitzonen zurück. Die zweite gibt eine "Übersetzung" der Zeit von einer Zeitzone zur nächsten zurück.

function timezone_diff($tz_from, $tz_to, $time_str = 'now') 
{ 
    $dt = new DateTime($time_str, new DateTimeZone($tz_from)); 
    $offset_from = $dt->getOffset(); 
    $timestamp = $dt->getTimestamp(); 
    $offset_to = $dt->setTimezone(new DateTimezone($tz_to))->setTimestamp($timestamp)->getOffset(); 
    return $offset_to - $offset_from; 
} 

function time_translate($tz_from, $tz_to, $time_str = 'now', $format = 'Y-m-d H:i:s') 
{ 
    $dt = new DateTime($time_str, new DateTimezone($tz_from)); 
    $timestamp = $dt->getTimestamp(); 
    return $dt->setTimezone(new DateTimezone($tz_to))->setTimestamp($timestamp)->format($format); 
} 

Demo:

$los_angeles_time = '2009-09-18 05:00:00'; 
$los_angeles_tz = 'America/Los_Angeles'; 
$hawaii_tz  = 'Pacific/Honolulu'; 

$los_angeles_hawaii_diff = timezone_diff($los_angeles_tz, $hawaii_tz, $los_angeles_time); 
echo $los_angeles_hawaii_diff . '<br />'; 

$hawaii_time = time_translate($los_angeles_tz, $hawaii_tz, $los_angeles_time); 
echo $hawaii_time . '<br />'; 
+0

Übrigens :), diese sind für PHP> = 5.3.0. – GZipp

+0

Sie scheinen DST nicht zu berücksichtigen. Ich benutze die oben genannten Funktionen, um CST in GMT zu verwandeln, und alle meine Zeiten sind um 1 Stunde abgelaufen. –

0

Einfach minus das erste Mal von der Sekunde.

, dass Sie den Zeitunterschied in Sekunden erhalten können.

1

Als GZipp kommentiert, ist sein Code wirklich nur für PHP> = 5.3.0. Das ist in Ordnung, aber - hier ist eine Version, die in PHP> = 5.2.0 funktioniert. (Übrigens funktioniert es auch in 5.3+ und mit 2 weniger Funktionsaufrufen)

<?php 
function time_translate($tz_from, $tz_to, $time_str = 'now', $format = 'Y-m-d H:i:s') 
{ 
    $dt = new DateTime($time_str, new DateTimezone($tz_from)); 
    $dt->setTimezone(new DateTimezone($tz_to)); 
    return $dt->format($format); 
} 

$time_diffs = array('now', '-1 hour', '-1 day', '-1 week', '-1 month', '+1 hour', '+1 week', '+1 month'); 

foreach ($time_diffs as $diff) 
{ 
echo "{$diff}:" 
    . "\n\t" 
    . "Current: " . date("Y-m-d H:i:s", strtotime($diff)) 
    . "\n\t" 
    . "UTC: " . time_translate("US/Eastern", "UTC", $diff) 
    . "\n\n"; 
} 
+0

Vielen Dank, es funktioniert mit PHP 5.2 Version. Aber wenn ich mit dem kleinsten und dem zweiten Unterschied gehen will, was sollten meine Parameter sein? Mittel in Zeitdifferenz. – user3305818

+0

Der Parameter '$ diff' (' $ time_str') ist einfach eine Zeichenfolge, die 'strtotime' versteht und die einen geeigneten Unix-Zeitstempel zurückgibt. Übergeben Sie einfach "-1 Minute" oder "-1 Sekunde" oder das gewünschte Intervall.Der Zweck dieser Frage/Antwort war nicht, Zeitunterschiede zu berechnen oder die Verwendung von ['strtotime'] (http://php.net/strtotime) zu erklären, sondern eine Zeit in einer Zeitzone in die Ortszeit umzuwandeln eine andere Zeitzone. –

+0

Seine funktioniert. Aber jetzt wenn ich alle Parameter wie 1 Tag, 3 Stunden, 10 Minuten und 20 Sekunden vorher liefern möchte. Erzähl es mir bitte. – user3305818