2012-10-17 7 views
6

Z obiektu DateTime interesuje mnie uzyskanie czasu w różnych strefach czasowych. Jak wyjaśniono w DateTime::setTimezone doc, to działa całkiem dobrze, gdy obiekt jest tworzony DateTime z ciągiem:PHP Obiekt DateTime - Konflikt datownika i stref czasowych

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

Powyższe przykłady wyświetli:
2000-01-01 00: 00: 00 + 12: 00
2000-01-01 01: 45: 00 + 13: 45
31.12.1999 12: 00: 00 + 00: 00

teraz jest interesująca część: Jeśli odbierzemy w górę nasz znacznik czasu i zainicjować z nim obiekt DateTime zgodnie z instrukcją obsługi.

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

I tu mamy: // [edit] humm ... Niestety, to wyjście jest złe ...
31.12.1999 12: 00: 00 + 00: 00
1999- 12-31 12: 00: 00 + 00: 00
31.12.1999 12: 00: 00 + 00: 00

UTC zawsze !!! Nie możemy już zmienić strefy czasowej!?!

Czy to PHP, czy to ja? Wersja 5.3.15

+1

Czy nie należy określać strefy czasowej na tworzenie instancji z sygnaturą czasową? –

+0

Otrzymuję inny wynik tutaj http://codepad.viper-7.com/zAv8dz – Baba

+0

Działa dobrze na wersji 5.3.15 ....... – Baba

Odpowiedz

5

Ok, więc sam się wkurzyłem. Oczywiście, ja jestem tym, który się myli ...
Aby to zrobić, po prostu podniosę bity, które są relewanty w doc here i here.
Instrukcja mówi:

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

Więc rzeczywiście, można użyć setTimezone dostać razy ponownie w swojej strefie czasowej (co może się spodziewać, jeśli Twój system jest skonfigurowany w ten sposób!):

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

Zauważ, że

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

jest mylące, ponieważ będziesz w UTC anyways! (i tak, jest to bardzo jasno określone w dokumencie konstruktora, więc bądź ostrożny;)

Dzięki @hakre Dzięki!

+0

Jeśli potrzebna jest data (odpowiadająca twojej strefie czasowej) w formacie mysql, możesz również użyć następujących opcji: $ mysql_time = date ("Y-m-d H: i: s", $ ts_time); – mika

Powiązane problemy