• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Zeitzonen

djfabi

Mitglied
Hallo,

ich habe ein kleines Community-Projekt, welches im localhost läuft.

Allerdings gibt es da für mich ein Logik Problem: die Zeitzonen.

Wenn sich ein Nutzer neu registriert, und ich die Zeit (mittels time()) in die Datenbank eintrage, passt das ja noch alles, da ich überall, egal wo man ist, die Serverzeit (Berlin) eingetragen wird. Da ist eine Zeitzone ja egal. Aber wenn ich dem Nutzer später sagen will, wann er sich genau registriert hat, wird es problematisch.

Die Registrierungszeit sollte ja schon immer von der aktuellen Zeitzone des Servers sein, das ich die Nutzer vergeichen kann.

Beispiel: ein Nutzer in China (+7) registriert sich, zur gleichen Zeit (+-2) wie ein Nutzer in Deutschland (+1).

So nun haben beide einen time() Code, von etwa: 1367244044

oder soetwas in der Art. So das ist nun die Berlin Zeit (da wo der Server steht)

Wenn ich ihm nun sagen will, wann genau das war, würde ja bei beiden etwas rauskommen wie: 29.04.2013 um 16:01 oder so..

Aber das kann ja nur für den Deutschen User stimmen, denn der Chinesische User hat sich ganz sicher nicht um 16:01 sondern eher um 23:01 registriert.


Die Frage ist nun, wie kann ich:
1. das mit den untersschiedlichen Zeitzonen lösen, aber trotzdem mit dem Vergleich time() immer auf der Zeitzone Berlin blieben?
2. Die Zeitzone des Nutzers herausfinden?

zu 1.:
Alle Nutzer sollten schon vergleichbar sein, das ich sagen kann:
Nutzer Deutschland: 1367244042
Nutzer China: 1367244044
zuerst registriert: Nutzer Deutschland



Ein weiteres Beispiel:
in meinem facebook-ähnlichem Newsfeed wird ein Beitrag angezeigt: (Deutscher Nutzer postet)
In der Datenbank: 1367244044
Umgewandelt in Datum: 29.04.2013 um 16:01
Aber wenn der Nutzer in China das 2-3 Minuten später sieht, wird es ja problematisch, denn es wurde zwar vor 2 Minuten gepostet (*), allerdings bei ihm nicht um 16:01, das wäre dann bereits ja schon 7 Stunden her.

zu *: mit einer Funktion wird bei mir auch soetwas angezeigt: vor 2 Minuten, vor 2 Monaten etc.
Da wäre es ja schon wieder irrelevant, da einfach der aktuelle time() genommen wird (Berlin Zeitzone) und mit der von dem Post verglichen wird. (Auch Berlin)
d.h. auch wenn dann vor 2 Minuten stünde, würde es (aus Sicht des Chinesen) nicht mit der Stunden anzeige passen.


Ich hoffe ihr versteht mein Anliegen, und es ist verständlich.
Gruß
 
Werbung:
Diese Zahlen


sind UNIX-Zeitstempel. Du solltest auch dabei bleiben diese auf Deutschland-Zeit (GMX+2 oder auch CET genannt) in der Datenbank zu speichern. Dadurch hast Du einen festen Wert mit dem Du vergleichen kannst.

Du solltest außerdem zu jedem Nutzer die für ihn gültige Zeitzone speichern. Dazu gibt es in Foren wie diesem hier z.B. das Auswahlfeld bei dem der Nutzer auswählen muss in welcher Zeitzone er sich befindet. Also hast Du neben der Registrierungszeit auch die Angabe der Zeitzone des Nutzers, am besten in der Form "+2" oder "-3" oder "+6".

Ausgehend von diesen beiden Angaben kannst Du dann beim Auslesen des Registrierungszeitpunktes mit DATE_ADD oder DATE_SUB die anzuzeigende Zeit berechnen. Beispiel:

Code:
SELECT DATE_ADD(registrierungszeit, INTERVAL zeitzone HOUR) FROM users

Siehe auch: https://dev.mysql.com/doc/refman/4.1/en/date-and-time-functions.html#function_date-add

Identisch müsstest Du das auch mit allen anderen auszulesenden Zeiten machen. Um Performance bei den SQL-Statements zu sparen, könntest Du auch die Zeitzone des Nutzers in einer PHP-Variable speichern und in die Statements integrieren, Beispiel:
PHP:
$sql = "SELECT DATE_ADD(postzeit, INTERVAL ".$zeitzone." HOUR) FROM posts WHERE post_id = ".$postid;
 
Zurück
Oben