Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Hilfe!! - Datum / GMT / Zeitzonen Wirrwarr! [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Hilfe!! - Datum / GMT / Zeitzonen Wirrwarr!


 
pixtur
16-06-2006, 17:44 
 
Hallo alle zusammen...

ich habe mich in letzter Zeit sehr intensive mit folgender Frage beschäftigt:

Ich suche eine genaue und einfache Definition von Zeitumrechnungen, die PHP5-konform (also ohne "is_dst is depreciated", etc.) ist und spezialitäten wie Sommerzeit berücksichtigt.

Was ist brauche ist folgendes:

- In der Datenbank möchte ich nur GMT/UTC im sql-datumsformat speichern (z.b. "2006-06-08 12:12:12")

- alle Datumseingaben des Anwenders müssen automatisch in GMT konvertiert werden (inklusive Sommerzeit, Zeitzone, 29. Februar, etc.). Am besten ohne, dass dieser eine Einstellung vornehmen muss.

- die Zeiten aus der Datenbank möchte ich in dessen localer Zeit ausgeben, am besten mit einem date()-format String.

Ich glaube, dass ist garnicht schwer, aber im schieren Informationschaos habe ich dazu keine verständliche Beschreibung gefunden. In einer der letzten Ausgaben des PhpMagazins war ein ziemlich verkorkster Artikel, der auf mehreren Seite nur noch mehr Verwirrung gestiftet hat. Dabei muss es doch ein paar Zeilen Code geben, die genau dieses Problem beschreiben und irgend wann einmal ins PHP-Manual rein müssen.

interessante Lektüre:
- http://www.tutorials.de/forum/php/235368-zeitzonen-wirr-warr-date_default_timezone_set-date_default_timezone_get.html


Detailfragen:
- Wie ermittelt PHP die lokale Zeit des Anwenders (aus dem HTTP-Header?)
- Was passiert, wenn die Urzeit auf dem Server falsch geht?
- kommt man um "Zeitzonen-Einstellung" für jeden Anwender (wie bei phpBB oder diesem Forum) überhaupt herum? Oder kann php5 die Zeitzone automatisch aus dem Request ermitteln?

Szenario:
- Hans und George arbeiten auf einem Server in Berlin, dessen Zeit 30 Minuten hinterher läuft.
- Hans arbeitet auf GMT+1 ("Berlin"). Seine lokale Uhrzeit geht 10 Minuten zu früh.
- George arbeitet auf GMT-5 ("New York"). Seine lokale Zeit geht eine eine Minute nach.
- Wenn Hans um Fri, 09 Jun 2006 10:00:00 GMT einen Beitrag schreibt und George fünf Minuten später antwortet, sollten die Zeiten auf dem Server auch fünf Minuten auseinander liegen aber lokal dennoch die "erwartete" Zeit relative zur eigenen zeigen.

Für alle Informationen (am besten Code-Fragmente) bin ich sehr sehr sehr dankbar.

tom / www.pixtur.de / www.streber-pm.org





Jetzt bin ich auf die Idee gekommen, Javascript zum Auslesen der aktuellen CLient-Uhrzeit zu verwenden.

Der Code sieht ungefähr so aus.

im login-form...

echo "<input type=hidden id=user_timeoffset name=user_timeoffset>";
echo '<script type="text/javascript">
var now = new Date();
document.getElementById("user_timeoffset").value= (now.getHours() + ":" + now.getMinutes() +":"+ now.getSeconds());
;
</script>';


im submit...

### guess time client time offset to gmt in seconds ###
{
### store date-offsetset for this user ###
if($time_offset= get('user_timeoffset')) {
list($hour,$min,$sec) = explode(':',$time_offset);
$client_day_seconds= $hour*60*60+ $min*60+ $sec;
}

### get servertime ###
list($hour,$min,$sec) = explode(':', gmdate('H:i:s', time()));
$server_day_seconds= $hour*60*60+ $min*60+ $sec;
$offset= $server_day_seconds - $client_day_seconds;
if($offset < - 12*60*60) {
$offset+= 24*60*60;
}
else if($offset > 12*60*60) {
$offset-= 24*60*60;
}
log_message("usertime offset = $offset sec", LOG_MESSAGE_LOGIN_SUCCESS);
}


Diese Sekunden würde ich auf jede Zeitangabe des Nutzer aufaddieren, bzw bei allen Zeitausgaben von GMT-Zeiten aus der Datenbank abziehen. Macht das Sinn, oder ist das die dümmste Idee aller Zeiten?

Bitte im Feedback...

tom

 
the_wh0
16-06-2006, 18:02 
 
also ich habe mich auch kürzlich damit beschäftigt und folgenden link gefunden:
http://www.psyon.org/projects/tzphp/index.php
dort sind ua. funktionen um die zeit in eine andere zeitzone umzuwendeln.
die jeweilige zeitzone werden per ISO3166 spezifiziert. zB. Europe/Vienna

 
pixtur
16-06-2006, 18:04 
 
jaja,

aber das Problem ist die Zeitzone des Clients herauszubekommen, ohne Ihn danach zu fragen.

tom

 
the_wh0
16-06-2006, 18:33 
 
oh... also wenn das so ist brauchst du ja nur die beiden zeiten der user zu vergleichen und richtig zu runden um dann die zeitdifferenz zwischen user und GMT zu errechnen, um dann alles auf GMT zu beziehen..
andre möglichkeit wäre das ganze über ip2country zu machen. dann das jeweilige land einer zeitzone zuzuordnen (was schwierig sein kann , da russland so um die 5 zonen hat).

 
pixtur
16-06-2006, 18:45 
 
Das Vergleichen der beiden Zeiten und die Differenz bilden mache ich ja mit meinem Source-Code Experiment. Die Frage war ja, ob das (wie ich es implementiert habe) Sinn macht, oder ob ich dar irgendwas übersehen habe.

tom

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 22:49 Uhr.