Hallo Hauke,
Daher habe ich mir den Ratschlag zu Herzen genommen, mit PHP den Oracle-Timestamp der in der Datenbank ist, mit Hilfe der TO_CHAR Funktion so zu formatieren, dass die PHP Funktion strtotime daraus einen Posix-Timestamp macht. Mit der Funktion time() bekomme ich den aktuellen und die Differenz ist klar.
Mit diesem Verfahren dürfte es auch keine Probleme geben mit Sommer und Winterzeit, oder? Weil es steht ja die Uhrzeit von dem Moment der Speicherung drin und die wird ja in das POSIX-Format gebraucht.
Die Formulierung ist etwas unglücklich gewählt, aber Du meinst das richtige, ja. Die PHP-Funktion strtotime() kennt die Umstellungszeiten von Sommer- und Winterzeit (weil das Betriebsystem sie kennt!) und kann deswegen eine Lokalzeit korrekt zuordnen. Einzige Ausnahme wäre die doppelte Stunde während der Zeitumstellung von Sommer- auf Winterzeit, d.h. z.B. 2006-10-29T02:30:00 ist nicht eindeutig in unserer Zeitzone. In dem Fall nimmt strtotime() glaube ich die Winterzeit, ich bin mir aber nicht sicher. Das Problem dieser doppelten Stunde ist jedoch, dass es in Oracle keine Möglichkeit gibt, die zu unterscheiden. Wobei man ja ausgerechnet an diesem Sonntag um 02:00 wohl kaum einen aktuellen Eintrag erzeugt, oder? ;-) Bzw. selbst wenn, dann gäbe es halt bei diesem speziellen Datum das Problem, dass eventuell eine Stunde Differenz entsteht.
Nun ist meine letze Frage noch, gibt es eine Funktion, die mir die Sekundenzahl in Jahre, Monate, Tage, Stunden, Minuten und Sekunden aufbricht? Oder muss man das per Hand machen? Aber so wie ich PHP kenne, gibt es da auch was ;-)
Du kannst entweder mittels date() oder strftime() Dir ein Datum formatieren oder, um z.B. das Jahr zu extrahieren, einfach nur sowas wie $jahr = idate('Y', $timestamp);
machen (idate() ist das gleiche, wie Date, allerdings kannst Du nur eine Formatierung verwenden und es gibt Dir immer einen Integer zurück), dann steht in $jahr so etwas wie 2006 drin, genauso mittels 'm', 'd', ...
Alternativ kannst Du mittels localtime() Dir ein assoziatives Array mit allen heruntergebrochenen Daten zurückgeben lassen - allerdings musst Du zu tm_year 1900 addieren (für dieses Jahr würde es bspw. 106 liefern) und zu tm_mon 1 addieren (für November liefert es 10, für Januar 0).
Ist vermutlich Geschmackssache, was einem besser gefällt. Ich persönlich würde der Verständlichkeit wegen wohl eher idate() nehmen, als localtime(), denn der Geschwindigkeitsunterschied ist marginal (idate() musst Du halt mehrfach aufrufen).
Viele Grüße,
Christian
"I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup