Frage

Für diejenigen von uns, die mit standard-shared-hosting-Pakete, wie GoDaddy oder Network Solutions wie gehen Sie mit datetime-conversions, wenn Sie Ihre hosting-server (mit PHP) und MySQL-server sind in unterschiedlichen Zeitzonen?

Auch, hat jemand einige best-practice-Empfehlungen für die Bestimmung, in welcher Zeitzone ein Besucher Ihrer Website und die Manipulation einer datetime-variable angemessen?

War es hilfreich?

Lösung

PHP 5.1.0, die Sie verwenden können date_default_timezone_set() Funktion zum festlegen der Standard-Zeitzone für alle Datum/Uhrzeit-Funktionen in einem Skript.

Für MySql (zitiert aus MySQL-Server-Unterstützung Für Zeitzonen Seite)

Vor MySQL 4.1.3, der server funktioniert nur in der system-Zeitzone festlegen, die beim Systemstart.Beginnend mit MySQL 4.1.3 der server betreibt mehrere Zeit zone Einstellungen, von denen einige zur Laufzeit geändert werden kann.

Für Sie von Interesse ist pro-Anschluss-Einstellung der Zeitzonen, die Sie verwenden würden, an den Anfang Ihres Skripts

SET timezone = 'Europe/London';

Für die Erkennung der client-Zeitzone-Einstellung, Sie könnte verwenden Sie ein wenig JavaScript zu bekommen und zu speichern, dass Informationen, die ein cookie, und verwenden Sie es auf nachfolgenden Seiten liest, zu berechnen die richtige Zeitzone.

//Returns the offset (time difference) between Greenwich Mean Time (GMT) 
//and local time of Date object, in minutes.
var offset = new Date().getTimezoneOffset(); 
document.cookie = 'timezoneOffset=' + escape(offset);

Oder könnten Sie bieten dem Anwender die Wahl, um Ihre Zeit Zonen selbst.

Andere Tipps

Speichern Sie alles als UTC.Sie können Konvertierungen auf client-Ebene, oder auf der Seite des Servers mit dem client-Einstellungen.

php - Datum

mysql - utc-Zeitstempel

WIEDER die Antwort von Željko Živković, Zeitzone Deskriptoren wie 'Europe/London' funktionieren nur, wenn der mySQL-admin Hinzugefügt hat, der Zeitzone und Tabellen das system und hält Sie aktualisiert.

Sonst sind Sie beschränkt auf numerischen offsets wie '-4:00'.Glücklicherweise ist die php date('P') - format bietet es (Stand: 5.1.3)

So sagen in einer app-config-Datei, die Sie haben könnten

define('TZ', 'US/Pacific');
....
if (defined('TZ') && function_exists('date_default_timezone_set')) {
    date_default_timezone_set(TZ);
    $mdb2->exec("SET SESSION time_zone = " . $mdb2->quote(date('P')));
}

Das bedeutet, dass PHP und mySQL auf Zustimmen wird, was timezone-offset zu verwenden.

Verwenden Sie immer die ZEITSTEMPEL für die Speicherung der Zeitwerte.Die Spalte wird gespeichert als UNIX_TIME (Epoche), sondern implizit aus der aktuellen time_zone offset beim schreiben, und Rücken beim Lesen.

Wenn Sie möchten die Zeiten anzeigen für Benutzer in anderen Zeitzonen befinden, anstatt eine Globale zu definieren(), set Ihre angegebene Zeitzone, in der oben.TIMESTAMP-Werte werden automatisch umgewandelt, die von mySQL durch die Zeit, Ihre app sieht die Ergebnismenge (die manchmal zu einem problem werden kann, wenn Sie müssen eigentlich wissen, wie die ursprünglichen Zeitzone des Ereignisses auch dann muss man es in einer anderen Spalte)

und so weit wie, "warum nicht einfach speichern alle Zeiten als int ist", heißt verlieren Sie die Fähigkeit zu vergleichen und zu validieren, Daten, und das bedeutet, dass Sie immer haben Sie zum konvertieren in date-Vertretung auf der app-Ebene (und ist schwer auf den Augen, wenn Sie sich die Daten direkt - schnell-was passiert auf der 1254369600?)

Ich speichern Sie alle meine Termine als bigint wegen hatte Probleme mit der dateTime-Typ vor.Speichere ich das Ergebnis der Zeit() PHP-Funktion zu es, jetzt Sie gelten als in der gleichen Zeitzone :)

In php-set timezone (Zeitzone einstellen, indem Sie die php.ini-Datei: ini_set("date.timezone", "America/Los_Angeles");

oder insbesondere die Seite, die Sie tun können: date_default_timezone_set("America/Los_Angeles");

In mysql können Sie tun wie: SET GLOBAL time_zone = 'America/Los_Angeles';

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top