2009-10-13 10 views
5

Ich habe gelesen, wie man das den ganzen Morgen macht, und der allgemeine Konsens ist: Speichern Sie Ihre Zeitstempel in UTC und berechnen Sie den Offset von dort.Anzeige von Zeitzonen ohne Verwendung von UTC

Wie auch die meisten Leute, behalte ich eine bestehende Codebasis und ich kann die Art, wie wir unsere Daten speichern, nicht ändern. Zumindest nicht im vorgegebenen Zeitrahmen.

Also meine Frage ist, kann ich sicher so etwas tun?

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

Einige Leute haben davon abgeraten, Datumsarithmetik zu machen, aber was mache ich hier falsch? Gibt es einen besseren Weg? Gibt es Fallen, auf die ich achten muss? Ich bin besonders daran interessiert, welche Art von Fehlern diese Methode erzeugen könnte, und wenn ja, wen werden sie beeinflussen?

Mein Chef ist die Art von Kerl, der sich nicht kümmert, wenn der Fehler nur 1% der Benutzerbasis betrifft.

Edit: Kann ich das klarer machen? Ich glaube nicht, dass ich zu viele davon habe. Jemand? Selbst ein vager Vorschlag oder ein Link wäre immens hilfreich.

Antwort

5

Die kurze Antwort ist, dass Zeitzonen schwierig zu handhaben sind und niemand die schwierigen Fragen angehen will!

Je länger, Antwort lautet:

Erstens benötigen Sie eine Darstellung Ihres Datum zu erstellen, in ihren aktuellen Zeitzonen. Die folgenden sind äquivalent:

date_default_timezone_set('America/New York'); 

$date = new DateTime(null); 

ODER

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

Dies gibt Ihnen einen Termin mit Zone America/New York eingestellt. Wir können es einfach für den Benutzer Zeitzone konvertieren, in diesem Fall Europa/Paris mit der nächsten Zeile:

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

Sie können die folgende Zeile verwenden das Datum/Zeit an jedem beliebigen Punkt dargestellt zu bekommen.

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

I stark empfehlen diese über Arithmetik, wie die in PHP-Funktionen Kenntnisse über Tageslicht verfügt über integrierte Sparzeiten und vielen komplizierter Dinge, die Sie nicht richtig bekommen.


Mein Testskript in voller Länge:

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

Sie könnten auch diesen Ansatz verwenden, um Ihre Datenbank zu UTC in einer einmaligen Aufgabe für die zukünftige Verwendung zu aktualisieren. –

+0

Das ist genial. Angenommen, ich verwende PHP 5.14, das dieses Objekt nicht enthält. Gibt es eine andere Art und Weise? –

+0

Zend Framework hat eine php-basierte Lösung in Zend_Date, fragt aber nach PHP 5.2.4 als allgemeine Voraussetzung für das Framework. Es könnte funktionieren. Können Sie PHP upgraden oder neu kompilieren? –

Verwandte Themen