date: Pentium Bug in PHP?

Wadlschrat

Mitglied
Ich will die Differenz zwischen 28.09.2009 00:00:01 und 18.01.2010 23:59:59 wie folgt ermitteln:

PHP:
$dateIn= date(mktime(0, 0, 1, 9, 28, 2009));
$dateOut= date(mktime(23, 59, 59, 1, 18, 2010));
echo"<br/>von ".date("d.m.y",$dateIn)."<br/>bis ".date("d.m.y",$dateOut);
echo"<br/>Tage: ".($dateOut-$dateIn)/24/3600;

Ausgabe:

von 28.09.09
bis 18.01.10
Tage: 113.04164351852​

Ist der Ansatz grundsätzlich Käse? SM Excel kommt z.B. auf 112,9999769 Tage. Hab selbst mal gezählt und komme auch auf auf das zweite Ergebnis.
 
Lass einmal die date-Funktion weg. Wenn du zwei Timestamps wie sie von mktime zurückgegeben werden voneinander Subtrahierst dürfte dein Vorhaben funktionieren.

Formatiere erst die Ausgabe entsprechend.
 
Wie CookieBuster schon sagt, die oberen beiden Aufrufe von [phpf]date[/phpf] bringen nichts.

Grundsätzlich vermute ich den Fehler dort, dass SM Excel mit mehr Stellen rechnet als PHP und dadurch eine andere Zahl herauskommt....

Wenn du beides rundest, landest du aber bei beiden bei 113 Tagen ;)

Eventuell willst du auf präzisere Funktionen zurückgreifen...

BC Math
 
Danke für Eure schnelle Antwort. Hab beide Vorschläge versucht:

PHP:
echo"<br/>".((mktime(23, 59, 59, 1, 18, 2010)-mktime(0, 0, 1, 9, 28, 2009))/24/3600);
bcscale(20);
echo"<br/>".(bcdiv(bcsub(mktime(23, 59, 59, 1, 18, 2010),mktime(0, 0, 1, 9, 28, 2009)),86400));

Das Ergebnis ändert sich nicht. Microsoft darf nicht gewinnen. ;)
Was jetzt?
 
Mmmh, sowohl mein Windows-Rechner als auch mein alterwürdiger batteriebetriebener kommen bei 9766798/24/3600 auf 113.04164...... ....und letzterer hat bestimmt keinen Pentium drinnen :-)

Ich würde mal tippen, dass der Fehler
1. bei Excel und
2. nicht in der Berechnung, sondern im Zellenformat
zu suchen ist.

Excel arbeitet dort ja nicht mit einem UNIX-Timestamp, sondern speichert bei Datums-Zellen die Anzahl der vergangenen Tage seit 1.1.1900 , was natürlich weitaus ungenauer ist als ein UNIX-Timestamp
 
Da beides Montage sind, ergibt sich als Differenz genau 16 Wochen oder 112 Tage plus der zusätzlichen Stunden und Minuten aus der Uhrzeitdifferenz (d.h. 24 Stunden minus der 2 Sekunden). Also sind das knapp 113 Tage (112,99...) aber eben auf keinen Fall mehr als 113 Tage.
 
richtig, die Uhr wird zurückgestellt ;)

Die nächste Zeitumstellung ist am
Sonntag, den 25.10.2009 um 3:00 Uhr

Die Uhren werden dann um 1 Stunde zurückgestellt, die Nacht ist also eine Stunde länger.
Dabei findet der Wechsel von der Sommerzeit in die Winterzeit statt.

PHP:
$dateIn= date(mktime(0, 0, 1, 9, 28, 2009));
$dateOut= date(mktime(23, 59, 59, 1, 18, 2010));
echo"<br/>von ".date("d.m.y",$dateIn)."<br/>bis ".date("d.m.y",$dateOut);
echo"<br/>Tage: ".($dateOut-$dateIn-3600)/24/3600; // hier 1 Stunde abziehen

Ergebnis: 112.999976852
 
Zurück