2012-10-17 11 views
6

Von einem DateTime-Objekt bin ich interessiert, die Zeit in verschiedenen Zeitzonen zu bekommen. Wie in dem DateTime::setTimezone doc, das funktioniert ziemlich gut, wenn das Datetime-Objekt aus einer Zeichenfolge erstellt wird:PHP DateTime-Objekt - Zeitstempel und Zeitzonen Konflikt

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

$date->setTimezone(new DateTimeZone('UTC')); 
echo $date->format('Y-m-d H:i:sP') . "\n"; 

echo $date->getTimestamp() . "\n"; 

Die obigen Beispiele folgende Ausgabe:
2000-01-01 00: 00: 00 + 12: 00
2000-01-01 01: 45: 00 + 13: 45
1999-12-31 12: 00: 00 + 00: 00

Jetzt ist der interessante Teil: Wenn wir holen up unser Timestamp, und initiieren Sie unser DateTime-Objekt damit gemäß den manuellen Anweisungen.

$date2 = new DateTime('@946641600'); 

$date2->setTimezone(new DateTimeZone('Pacific/Nauru')); 
echo $date2->format('Y-m-d H:i:sP') . "\n"; 

$date2->setTimezone(new DateTimeZone('Pacific/Chatham')); 
echo $date2->format('Y-m-d H:i:sP') . "\n"; 

$date2->setTimezone(new DateTimeZone('UTC')); 
echo $date2->format('Y-m-d H:i:sP') . "\n"; 

echo $date2->getTimestamp() . "\n"; 

Und hier erhalten wir: // [Bearbeiten] humm ... Leider ist der Ausgang ist falsch ...
1999-12-31 12: 00: 00 + 00: 00
1999- 12-31 Dezember: 00: 00 + 00: 00
1999-12-31 12: 00: 00 + 00: 00

UTC forever !!! Wir können die Zeitzone nicht mehr ändern!?!

Ist es PHP oder bin ich es? Version 5.3.15

+1

Soll nicht eine Zeitzone bei Instanziierung mit dem Zeitstempel angegeben werden? –

+0

Ich bekomme ein anderes Ergebnis hier http://codepad.viper-7.com/zAv8dz – Baba

+0

Es funktioniert gut auf Version 5.3.15 ....... – Baba

Antwort

5

Ok, so wurde ich selbst verrückt. Natürlich bin ich derjenige, der falsch liegt ...
Um es gerade zu bekommen, hole ich nur die Bits, die in den Doc here und here relevant sind.
Handbuch sagt:

// Using a UNIX timestamp. Notice the result is in the UTC time zone. 
$date = new DateTime('@946684800'); 
echo $date->format('Y-m-d H:i:sP') . "\n"; 

So in der Tat, Sie setTimezone verwenden können, mal wieder in Ihrer Zeitzone zu bekommen (was, wenn Ihr System so eingerichtet ist zu erwarten ist!):

$timezone = new DateTimeZone('Europe/Madrid'); 
$date->setTimezone(new DateTimeZone('Pacific/Chatham')); 

Beachten Sie, dass

$date = new DateTime('@1306123200', new DateTimeZone('Europe/Madrid')); 

irreführend ist, da man sowieso in UTC sein! (und ja, es ist sehr klar im Konstruktor Dokument angegeben. So seien Sie vorsichtig;)

Vielen Dank @hakre Vielen Dank!

+0

Wenn Sie ein Datum (entsprechend Ihrer Zeitzone) im mysql-Format benötigen, können Sie auch sofort folgendes verwenden: $ mysql_time = date ("Y-m-d H: i: s", $ ts_time); – mika