PHP Zeitabstände Sommer/Winterzeit
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anzeige
code
dank
date
datum
fehler
gedankengang
http
konvertieren
problem
schwankung
sekunde
sommer
stunden
uhr
url
winterzeit
zahl
zeitpunkt
zeitzone
-
Hallo,
ich versuche seit längerem eine Zeitberechnung für ein Browsergame zu erstellen. Zeitberechnung soll heißen: Der Spieler startet z.B. einen Gebäudeausbau, der 5 Stunden dauern soll. Mit
kann ich mir das aktuelle Datum in Sekunden holen und dann für 5 Stunden 5x60x60=18.000 Sekunden hizufügen. Dann kann ich mittime();
eine lesbare Zeitangabe machen. Das klappt soweit auch, aber ich weiß nicht so recht, wie ich das bei der Sommer-/Winterzeit machen soll, denn durch die Umstellung gibt es nachts ja einmal im Jahr eine Stunde doppelt, wodurch Missversändnisse entstehen könnten. Habt ihr Lösungsvorschläge?date();
MFG THWBM -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Geht das in die Richtung von dem hier?
-
Hallo hackyourlife,
Erstmal danke für deine schnelle Antwort.
hackyourlife schrieb:
Geht das in die Richtung von dem hier?
Ich denke schon, aber zwei Sachen habe ich noch nicht so recht verstanden. Ich habe mir diesen Code von dir gerade mal ergänzt:
date_default_timezone_set('Europe/Berlin'); $Zeitpunkt = time(); $secs = date('H', $Zeitpunkt) * 3600 + date('i', $Zeitpunkt) * 60 + date('s', $Zeitpunkt); $s = $secs % 60; $m = ($secs / 60) % 60; $h = ($secs / 3600) % 60; printf('%02d:%02d:%02d', $h, $m, $s);
Er funktioniert auch, aber...
1.Wie sieht das bei der Sommer- und Winterzeitumstellung aus? Wird die Winterzeit benutzt, also die Normalzeit oder die Sommerzei? Nach der Umwandlung durch
wird die Sommerzeit einbezogen, aber wie sieht es mit dem reinendate();
aus?time();
2.Was ist, wenn ich abends um 23:00:00 eine Aufgabe starte, die 5 Stunden dauert? Ich müsste auch das Datum mit einbeziehen, oder?
MFG THWBM
-
thwbm schrieb:
time() sind Zeitumstellungen und Anpassungen an der Zeit vollkommen egal. Das Timestamp läuft weiter und zeigt die Sekunden, die seit dem 1. Januar 1970 um 00:00 Uhr UTC vergangen sind, an, jedoch werden Schaltsekunden übersprungen. Schalttage werden mitgezählt und ob es Sommer- oder Winterzeit ist, beeinflusst das Timestamp nicht. Eine Sekunde später = altes Timestamp + 1, mit Ausnahme der Schaltsekunde.
1.Wie sieht das bei der Sommer- und Winterzeitumstellung aus? Wird die Winterzeit benutzt, also die Normalzeit oder die Sommerzei? Nach der Umwandlung durch
wird die Sommerzeit einbezogen, aber wie sieht es mit dem reinendate();
aus?time();
thwbm schrieb:
In PHP nicht. Wird etwas mit 23.11.2012 um 23:00:00 Uhr + 5 Stunden datiert, dann kannst du es als 23.11.2012 um 28:00:00 Uhr schreiben und es wird automatisch das Timestamp für 04:00:00 Uhr am 24.11.2012 berechnet.
2.Was ist, wenn ich abends um 23:00:00 eine Aufgabe starte, die 5 Stunden dauert? Ich müsste auch das Datum mit einbeziehen, oder? -
Hallo drafted-map, danke für deine Antwort.
drafed-map schrieb:
time() sind Zeitumstellungen und Anpassungen an der Zeit vollkommen egal. Das Timestamp läuft weiter und zeigt die Sekunden, die seit dem 1. Januar 1970 um 00:00 Uhr UTC vergangen sind, an, jedoch werden Schaltsekunden übersprungen. Schalttage werden mitgezählt und ob es Sommer- oder Winterzeit ist, beeinflusst das Timestamp nicht. Eine Sekunde später = altes Timestamp + 1, mit Ausnahme der Schaltsekunde.
drafed-map schrieb:
In PHP nicht. Wird etwas mit 23.11.2012 um 23:00:00 Uhr + 5 Stunden datiert, dann kannst du es als 23.11.2012 um 28:00:00 Uhr schreiben und es wird automatisch das Timestamp für 04:00:00 Uhr am 24.11.2012 berechnet.
Das heißt also, dass die Zahl, die ich bei
erhalte eine eindeutige Zahl ist, die sich weder auf die Zeitzone, noch auf die Sommer- oder Winterzeit bezieht? Dann heißt das also, dass ich die Zahl vontime();
einfach in eine MySQL Datenbank schreiben kann, nachdem ich 5 Stunden (natürlich in Sekunden umgewandelt) addiert habe. Dann muss ich nurnoch die Anzeige mittime();
in meine Zeitzone/Sommer-/Winterzeit konvertieren und ich habe dann eigentlich keine Fehlerquellen mehr? Stimmt mein Gedankengang soweit oder habe ich etwas übersehen?date();
Wie sieht das bei der Schaltsekunde aus? Diese kann ich ignorieren, da (nur) schwankungen von 1 Sekunde möglich sind, was auf 5 Stunden nicht relevant ist, oder?
MFG THWBM -
Warum benutzt Du nicht den php Befehl strtotime? Mit echo strtotime("+5 hours"); wird zu der aktuellen Zeit 5 Stunden addiert.
siehe auch: http://www.php.net/manual/de/function.strtotime.php -
staymyfriend schrieb:
Warum benutzt Du nicht den php Befehl strtotime? Mit echo strtotime("+5 hours"); wird zu der aktuellen Zeit 5 Stunden addiert.
siehe auch: http://www.php.net/manual/de/function.strtotime.php
Das löst aber weder mein ursprüngliches Problem noch antwortet es auf eine meiner neueren Fragen. Mein Problem ist nicht das Umwandeln der Angaben (Von Sekunden seit 1.1.1970 00:00:00 zu lesbarem Datum und zurück) sondern die Berücksichtigung der Sommer- bzw. Winterzeit und der Zeitzone. Diese beiden Dinge haben nicht viel miteniander zu tun.
MFG THWBM -
Hi,
thwbm schrieb:
Das stimmt so weit alles.
Das heißt also, dass die Zahl, die ich bei
erhalte eine eindeutige Zahl ist, die sich weder auf die Zeitzone, noch auf die Sommer- oder Winterzeit bezieht? Dann heißt das also, dass ich die Zahl vontime();
einfach in eine MySQL Datenbank schreiben kann, nachdem ich 5 Stunden (natürlich in Sekunden umgewandelt) addiert habe. Dann muss ich nurnoch die Anzeige mittime();
in meine Zeitzone/Sommer-/Winterzeit konvertieren und ich habe dann eigentlich keine Fehlerquellen mehr? Stimmt mein Gedankengang soweit oder habe ich etwas übersehen?date();
thwbm schrieb:
Nein, diese verursacht für deinen Anwendungsfall überhaupt keine Schwankungen, zumindest, solange du niemals die Ausführung des Programms um eine Sekunde verzögerst und dann davon ausgehst, dass sich das Timestamp auch um 1 erhöht hat. Verwendest du immer das Timestamp aus time(), werden Schaltsekunden automatisch nicht mitgezählt und date() erwartet auch, dass Schaltsekunden nicht mitgezählt werden, weswegen dann alles stimmt.
Wie sieht das bei der Schaltsekunde aus? Diese kann ich ignorieren, da (nur) schwankungen von 1 Sekunde möglich sind, was auf 5 Stunden nicht relevant ist, oder?
Ein Beispiel:
Es ist 15:05:30 Uhr und zwischen 15:05:59 Uhr und 15:06:00 Uhr vergehen zwei Sekunden, weil es eine Schaltsekunde gibt und dazwischen deswegen noch die Uhrzeit 15:05:60 Uhr (das wird so angegeben) liegt. time() wird dir zum Zeitpunkt 15:05:60 Uhr und 15:06:00 Uhr den gleichen Wert zurückgeben. Addierst du zum Timestamp von 15:05:30 Uhr also 60 Sekunden und wandelst dieses mit date() wieder in eine Uhrzeit um, wird also 15:06:30 Uhr herauskommen, obwohl inzwischen nicht 60, sondern 61 Sekunden vergangen sind. Lässt du das Script jedoch 60 Sekunden lang schlafen und lässt dir dann das aktuelle Timestamp ausgeben, wird es dir das von 15:06:29 Uhr ausgeben, da wirklich nur 60 Sekunden lang gewartet wird, auch, wenn dazwischen eine Schaltsekunde liegt.
thwbm schrieb:
date() gibt dir das automatisch richtig aus. Willst du es anders machen, kannst du über date('I') herausfinden, ob das angegebene Datum in der Sommer- oder der Winterzeit liegt. Dir wird dann eine 1, respektive eine 0 zurückgegeben.
Mein Problem ist nicht das Umwandeln der Angaben (Von Sekunden seit 1.1.1970 00:00:00 zu lesbarem Datum und zurück) sondern die Berücksichtigung der Sommer- bzw. Winterzeit und der Zeitzone. -
Danke drafed-map,
mit deinem Beispiel habe ich es jetzt verstanden. Ich habe schon Stunden vor dem PC verbracht, um das Problem zu lösen und jetzt ist es gelößt. Danke.
Wenn jemand eine Schaltsekunde zwischen dem Start und dem Ende seiner Aktion hat, hat er pech gehabt und muss 5:00:01 Warten, und nicht nur 5:00:00, aber ich denke über so etwas lässt sich hinwegschauen. -
Es gab erst 24 Schaltsekunden, die sich über 40 Jahre verteilt haben: http://de.wikipedia.org/wiki/Schaltsekunde#Liste_aller_Schaltsekunden Außerdem wird sich wohl kaum jemand wegen einer Sekunde aufregen, sofern sie denn überhaupt jemand erwischt.
Beitrag zuletzt geändert: 24.11.2012 0:12:11 von drafed-map -
drafed-map schrieb:
thwbm schrieb:
Das stimmt so weit alles.
Das heißt also, dass die Zahl, die ich bei
erhalte eine eindeutige Zahl ist, die sich weder auf die Zeitzone, noch auf die Sommer- oder Winterzeit bezieht? Dann heißt das also, dass ich die Zahl vontime();
einfach in eine MySQL Datenbank schreiben kann, nachdem ich 5 Stunden (natürlich in Sekunden umgewandelt) addiert habe. Dann muss ich nurnoch die Anzeige mittime();
in meine Zeitzone/Sommer-/Winterzeit konvertieren und ich habe dann eigentlich keine Fehlerquellen mehr? Stimmt mein Gedankengang soweit oder habe ich etwas übersehen?date();
Das stimmt soweit nicht alles. Ich habe gerade mal so aus Spaß die Zeitzone von "Europe/Berlin" in "Australia/Melbourne" geändert und wenn
eine weltweit eindeutige Zahl angeben würde, durfte sie sich logischerweise nicht stark verändern (nur so weit, wie ich zwischen den Versuchen gewartet habe), das hat sie aber. Die zeit ist um ungefähr 30.000 Sekunden gesprungen.time();
Wo ist der Fehler?
MFG THWBM -
Hast du die Zeitzone geändert und die Systemzeit beibehalten, oder hat sich damit auch die angezeigte Systemzeit automatisch geändert, bzw. du hast das selbst getan, wenn es nicht automatisch ging? Dir muss nämlich bei einer Änderung der Zeitzone vom System eine andere Zeit angezeigt werden. Hast du eine andere Zeitzone eingestellt und dir wird immer noch die Zeit wie in D angezeigt, ist logischerweise etwas schief gegangen. Das Timestamp stimmt nur, wenn dein PC die richtige UTC-Zeit eingestellt hat.
-
drafed-map schrieb:
Hast du die Zeitzone geändert und die Systemzeit beibehalten, oder hat sich damit auch die angezeigte Systemzeit automatisch geändert, bzw. du hast das selbst getan, wenn es nicht automatisch ging? Dir muss nämlich bei einer Änderung der Zeitzone vom System eine andere Zeit angezeigt werden. Hast du eine andere Zeitzone eingestellt und dir wird immer noch die Zeit wie in D angezeigt, ist logischerweise etwas schief gegangen. Das Timestamp stimmt nur, wenn dein PC die richtige UTC-Zeit eingestellt hat.
Ich habe an der Systemzeit nichts geändert, ich habe
indate_default_timezone_set('Europe/Berlin');
in der PHP Datei geändert. Dies hat die Zahl geändert, die indate_default_timezone_set('Australia/Melbourne');
angegeben wurde. Also stimmt dein Aussage:time();
drafed-map schrieb:
thwbm schrieb:
Das heißt also, dass die Zahl, die ich bei
erhalte eine eindeutige Zahl ist, [...]time();
Das stimmt so weit alles.
nicht. Also wird die Zeit seit dem 01.01.1970 00:00:00 in der Jeweiligen Zeitzone angegeben und ist Somit nicht weltweit eindeutig, oder?
MFG THWBM -
Nein, das Timestamp ist weltweit gleich und hängt nicht von der Zeitzone ab. Mit der von dir beschriebenen Einstellungsänderung darf es sich nicht ändern. Ich habe es gerade auch auf meinem Computer ausprobiert und das Timestamp war unter Vernachlässigung der Zeit, die zwischen den Ausführungen verging, gleich, obwohl ich einmal die erste Zeitzonen-Einstellung von dir und einmal die zweite verwendete.
-
Sobald die Funktion
irgendwo benutzt wird um einen Timestamp formatiert auszugeben wird die Zeitzone mit einberechnet… war das eventuell dein Fehler?date()
-
Hallo drafed-map und hackyourlife, danke für eure Antworten.
drafed-map schrieb:
Nein, das Timestamp ist weltweit gleich und hängt nicht von der Zeitzone ab. Mit der von dir beschriebenen Einstellungsänderung darf es sich nicht ändern. Ich habe es gerade auch auf meinem Computer ausprobiert und das Timestamp war unter Vernachlässigung der Zeit, die zwischen den Ausführungen verging, gleich, obwohl ich einmal die erste Zeitzonen-Einstellung von dir und einmal die zweite verwendete.
Ich hatte einen blöden Fehler in mein Script eingebaut, jetzt klappt es einwandfrei.
hackyourlife schrieb:
Sobald die Funktion
irgendwo benutzt wird um einen Timestamp formatiert auszugeben wird die Zeitzone mit einberechnet? war das eventuell dein Fehler?date()
Ja, so in etwa. ich habe in meinem Script die länge des bisherigen Tages anzeigen lassen. Der Tag hier in Europa hat natülich zu einem anderen Zeitpunkt begonnen, als der in Australien, was ich aber irgendwie übersehen habe. Vielen, vielen, vielen Dank an euch beide. Jetzt funktioniert es.
MFG THWBM -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage