2009-10-13 7 views
5

Czytałem o tym, jak to robić przez cały ranek, a ogólna zgoda jest taka: przechowuj swoje znaczniki czasu w UTC i oblicz z nich offset.Wyświetlanie stref czasowych bez użycia UTC

Jednak, podobnie jak większość ludzi, utrzymuję istniejący kod i nie mogę zmienić sposobu przechowywania naszych dat. Przynajmniej nie w wyznaczonym czasie.

Moje pytanie brzmi: czy mogę bezpiecznie zrobić coś takiego?

// this is my time zone 
$timestamp = strtotime($timestampFromDatabase); 
date_default_timezone_set('America/New York'); 
$tz = date_default_timezone_get(); 

// this is theoretically their timezone, which will eventually 
// be taken from a session variable 
date_default_timezone_set('Europe/Paris'); 
$offset = time() - $timestamp; 
$timestamp -= $offset; 

// now that I have the offset, display dates like this 
date('r', $timestamp); 

Niektórzy ludzie odradzali robienie arytmetyki terminów, ale czy to, co robię tutaj źle? Czy istnieje lepszy sposób? Czy są pułapki, na które muszę uważać? Szczególnie interesuje mnie rodzaj błędów, które ta metoda mogłaby wytworzyć, a jeśli tak, kto na nich wpłynie?

Mój szef to facet, który nie dba o to, czy błąd dotyczy tylko 1% bazy użytkowników.

Edytuj: Czy mogę uczynić to jaśniejszym? Wydaje mi się, że nie mam na to zbyt wielu chętnych. Ktoś? Nawet niejasna sugestia lub link byłyby niezwykle pomocne.

Odpowiedz

5

Krótka odpowiedź jest taka, że ​​strefy czasowe są trudne do pracy i nikt nie chce sprostać trudnym pytaniom!

Im dłużej, odpowiedź brzmi:

Po pierwsze, trzeba stworzyć reprezentację datą, w ich aktualnych stref czasowych. Poniższy są równoważne:

date_default_timezone_set('America/New York'); 

$date = new DateTime(null); 

LUB

$date = new DateTime(null, new DateTimeZone('America/New York')); 

To daje randkę z ustawionym na strefy Ameryki/Nowy Jork. Możemy łatwo przekonwertować je do strefy czasowej użytkownika, w tym przypadku Europa/Paryż z następnym wierszu:

$date->setTimezone(new DateTimeZone('Europe/London')); 

Można użyć następujący wiersz, aby uzyskać datę/czas reprezentowany w dowolnym momencie.

echo $date->format('d/m/Y H:i:s'); 

I silnie polecić to na arytmetyce, jak wbudowany w funkcji PHP posiadać wiedzę letni razy i wiele skomplikowanych rzeczy, które nie dostaną prawo.


Mój skrypt testowy w całości:

date_default_timezone_set('America/Belize'); 

$date = new DateTime(null); 

echo $date->format('d/m/Y H:i:s') . '<br>'; 

$date->setTimezone(new DateTimeZone('Europe/London')); 

echo $date->format('d/m/Y H:i:s') . '<br>'; 
+0

Można również użyć tej metody, aby zaktualizować bazę danych do UTC w jednorazowej pracy dla przyszłego wykorzystania. –

+0

To jest niesamowite. Załóżmy jednak, że używam PHP 5.14, który nie ma tego obiektu. Czy istnieje inny sposób? –

+0

Zend Framework ma rozwiązanie oparte na php w Zend_Date, ale prosi o PHP 5.2.4 jako ogólne wymaganie dla frameworka. To może zadziałać. Czy możesz aktualizować lub rekompilować PHP? –