time() und die Zeitzone
Encoder
- php
Hallo
Ich glaub ich steh grad nur gnadenlos auf dem Schlauch.
Mit time() ermittel ich mir die aktuelle Zeit. Nachdem das Sekunden sind, will ich mir mit modulo (24*3600) aus diesem Wert den Tag (also Stunde 0) rausrechnen.
Mir fehlt aber immer eine Stunde, hier wird die Zeitzone schuld sein. Das Problem ist dass der Wert von time() bei 0:00 Uhr kein genau durch den Teiler teilbarer Wert ist, sondern um eine Stunde verschoben ist.
Was für Funktionen kann ich hier nutzen, damit ich nicht ständig mit der Zeitzone rumrechnen muss?
Hi!
Mit time() ermittel ich mir die aktuelle Zeit. Nachdem das Sekunden sind,
Genauer gesagt ist das Ergebnis ein Unix-Timestamp, der, wie das so üblich ist, die Sekunden sind seit 1.1.1970 0:00:00 und zwar UTC zählt.
Mir fehlt aber immer eine Stunde, hier wird die Zeitzone schuld sein. Das Problem ist dass der Wert von time() bei 0:00 Uhr kein genau durch den Teiler teilbarer Wert ist, sondern um eine Stunde verschoben ist.
Oder um zwei.
Was für Funktionen kann ich hier nutzen, damit ich nicht ständig mit der Zeitzone rumrechnen muss?
Das geht in unserer Zeitzone nicht ohne sie zu berücksichtigen, weil sie immer ein oder zwei Stunden Differenz zu UTC hast.
Lo!
Hi,
Mit time() ermittel ich mir die aktuelle Zeit. Nachdem das Sekunden sind, will ich mir mit modulo (24*3600) aus diesem Wert den Tag (also Stunde 0) rausrechnen.
Wozu? Was willst du erreichen?
MfG ChrisB
Also ich zeichne ein Diagramm von 0 bis 24 Uhr. Dazu ermittel ich die aktuelle Zeit und wollte mir mit der Berechnung recht einfach den Beginn des Tages ermitteln.
Das selbe soll mit DATETIME Werten aus einer Datenbank passieren, für die ich ebenfalls den Beginn des aktuellen Tages ermiteln muss.
Deshalb suche ich nach etwas, wo ich einfach nur die Sekunden seit x erhalte, ohne dass da schon automatisch die Zeitzone drin steckt. Wenn aus der DB 13:15 kommt, dann ists auch 13:15. Egal ob Sommerzeit, Winterzeit, Deutschland, USA...
Hat jemand nen Vorschlag wie ich das vielleicht ganz anders machen könnte?
Hi,
Also ich zeichne ein Diagramm von 0 bis 24 Uhr. Dazu ermittel ich die aktuelle Zeit und wollte mir mit der Berechnung recht einfach den Beginn des Tages ermitteln.
Der Beginn des Tages ist 0:00 Uhr.
Das selbe soll mit DATETIME Werten aus einer Datenbank passieren, für die ich ebenfalls den Beginn des aktuellen Tages ermiteln muss.
Mir ist immer noch nicht klar, was eigentlich dein Problem ist.
Deshalb suche ich nach etwas, wo ich einfach nur die Sekunden seit x erhalte, ohne dass da schon automatisch die Zeitzone drin steckt.
Dann nimm den Unix Timestamp - der ist Sekunden seit 1.1.1970, 0:00 GMT.
Davon kannst du die Sekunden eines anderen Timestamps abziehen, ohne das Zeitzonen reinspielen.
DATETIME-Werte lassen sich mit der Funktion UNIX_TIMESTAMP beim Auslesen konvertieren.
MfG ChrisB
Dann nimm den Unix Timestamp - der ist Sekunden seit 1.1.1970, 0:00 GMT.
Das GMT daran ist mein Problem. time() (oder auch die Abfrage aus der DB) geben die Zeit als GTM zurück, bezogen auf die aktuelle Zeitzone.
Das heißt da ist die momentane eine Stunde bereits mit drin?!
Mein Problem:
$time = time();
print date("Y-m-d H:i:s", $time);
--> 2011-01-22 21:27:01
$time2 = $time - ($time % (24 * 3600));
print date("Y-m-d H:i:s", $time2);
--> 2011-01-22 01:00:00
Hier wärs recht nett wenn ich null Uhr bekäme, was mit "Sekunden seit 1.1.1970" ja auch der Fall sein sollte. Nur ist hier halt die eine Stunde aus der Zeitzome mit drin.
Ich frag mich auch was tatsächlich in der Datenbank steht. Kommts da auch auf die Zeitzone an, in was die gespeicherte Zeit dann umgerechnet wird?
Hallo,
Dann nimm den Unix Timestamp - der ist Sekunden seit 1.1.1970, 0:00 GMT.
Das GMT daran ist mein Problem.
warum ist das ein Problem? - Und GMT ist formal nicht richtig; es ist UTC.
time() (oder auch die Abfrage aus der DB) geben die Zeit als GTM zurück, bezogen auf die aktuelle Zeitzone.
Nein, UTC ist eben *nicht* auf irgendeine Zeitzone bezogen.
Das heißt da ist die momentane eine Stunde bereits mit drin?!
Nein, time() liefert jetzt (um etwa 23.30h MEZ) einen Timestamp, der 22.30h entspricht. Und zwar überall, egal ob in Buxtehude, in Nowosibirsk oder in Cienfuegos. Also unabhängig von der jeweiligen Zeitzone.
Mein Problem:
$time = time();
print date("Y-m-d H:i:s", $time);
--> 2011-01-22 21:27:01
Ja, date() rechnet den Timestamp auf die lokalen Zeitzone um.
$time2 = $time - ($time % (24 * 3600));
print date("Y-m-d H:i:s", $time2);
--> 2011-01-22 01:00:00
Auch klar - wenn du den Timestamp auf 00.00h UTC reduzierst und *dann* auf Ortszeit umrechnest, bekommst du 01.00h MEZ.
Hier wärs recht nett wenn ich null Uhr bekäme, was mit "Sekunden seit 1.1.1970" ja auch der Fall sein sollte. Nur ist hier halt die eine Stunde aus der Zeitzome mit drin.
Im Gegenteil, sie ist eben *nicht* mit drin. Erst mit der Umwandlung durch date() wird die Angabe wieder auf Ortszeit umgerechnet.
Ich frag mich auch was tatsächlich in der Datenbank steht. Kommts da auch auf die Zeitzone an, in was die gespeicherte Zeit dann umgerechnet wird?
Hoffentlich nicht.
Ciao,
Martin
Hi!
Dann nimm den Unix Timestamp - der ist Sekunden seit 1.1.1970, 0:00 GMT.
Das GMT daran ist mein Problem. time() (oder auch die Abfrage aus der DB) geben die Zeit als GTM zurück, bezogen auf die aktuelle Zeitzone.
Das heißt da ist die momentane eine Stunde bereits mit drin?!
Da ist im Grunde genommen nichts drin. Das "drin" kommt erst hinzu, wenn du auf lokale Zeit umrechnest. Dass der Unix-Timestamp so definiert ist, ist gut, denn sonst könnte man keinen weltweiten zeitlichen Abgleich vornehmen und wüsste auch nicht, auf welche Zeit genau sich nur 2:30 am Tage des Umstellens auf Normalzeit bezieht. Diese Information ergibt sich erst in der ausführlichen zeitzonenbezogenen Schreibweise: ... 2:30 MESZ oder MEZ. Das lässt sich dann aber nicht mehr mit einem simplen Integer abbilden, der deinen Forderungen nach Teilbarkeit auf 0:00:00 Lokalzeit nachkommt.
$time2 = $time - ($time % (24 * 3600));
Du machst neben den Zeitzonen auch noch den Fehler, von 24 Stunden pro Tag auszugenen. Das ist hierzulande derzeit gesetzlich nicht gegeben.
Ich frag mich auch was tatsächlich in der Datenbank steht. Kommts da auch auf die Zeitzone an, in was die gespeicherte Zeit dann umgerechnet wird?
Wie gesagt, der Unix-Timestamp bezieht sich immer auf UTC. Das Ermitteln eines Unix-Timestamps aus einem zeitzonenbezogenen Zeitpunkt muss den Offset dieser Zeitzone berücksichtigen, genauso wie eine Umrechnugn vom Timestamp in die lokale Zeit.
Vergiss einfach, dass du mit der Formel 24 * 3600 irgendwas Gescheites hinbekommst, dagegen wehrt sich schon die Sommerzeit.
Lo!
Ok dann hab ich das noch nicht ganz kapiert.
Was könnt ich denn sonst machen? Einer der Tips war mit "teuren" Strings zu rechnen, aber das ist ja wirklich performancetechnisch grausam und lesen kann mans auch nimmer wirklich.
Ich will eigentlich nur aus einer Zeit aus einer Tabelle die aktuellen Sekunden des Tages rausholen. Völlig egal welche Zeitzone das ist.
Aus MySql kriegt man ein Datum wirklich nur als String?
Ich sträube mich halt momentan noch gegen Ausdrücke der Art 3600 * HOUR(datum) + 60 * MINUTE(datum) + SECOND(datum).
Hi!
Ich will eigentlich nur aus einer Zeit aus einer Tabelle die aktuellen Sekunden des Tages rausholen. Völlig egal welche Zeitzone das ist.
Die Anzahl der Sekunden seit 0:00:00 Uhr? Dann bilde die Differenz zwischen der aktuellen Zeit und der vom selben Tag von 0 Uhr. Dazu kannst du sogar die Unix-Timestamps der beiden Werte nehmen.
Aus MySql kriegt man ein Datum wirklich nur als String?
So ohne weiteres, ja. Es gibt kein Datumsaustauschformat auf Binärebene, abgesehen vom Unix-Timestamp. Aber MySQL kennt einige Funktionen, mit denen man Zeitberechnungen vornehmen oder Bestandteile ermitteln kann. Ohne Berücksichtigung der Sommerzeit geht auch, auf den Zeit-Anteil die Funktion TIME_TO_SEC() anzuwenden.
Lo!
Ok vielen Dank!
Auf die Idee das in SQL zu machen bin ich noch gar nicht gekommen.
Hello,
ich benutze in einem solchen Fall immer strtotime(), was zwar ganz schön teuer ist, mir aber die ganze Überlegung mit Zeitzonen, Sommer/Winterzeit usw. erspart.
http://de3.php.net/manual/en/function.strtotime.php
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg