Fehler im PHP date_diff?
Marvin Esse
- php
0 Matthias Apsel0 Der Martin0 Marvin Esse0 dedlfix0 Tabellenkalk0 Der Martin0 dedlfix
0 pl
Hallo,
ich brauch mal Eure Hilfe...
Folgendes einfaches Script ergibt unverständlicherweise 0 anstatt der erwarteten 1.
$date1=date_create("2016-02-01");
$date2=date_create("2016-03-01");
$diff=date_diff($date1,$date2,true);
echo $diff->format("%m");
Wenn ich bei $date2 anstelle vom März den April eintrage, dann wird korrekt "2" ausgegeben.
Hat jemand eine Erklärung?
Liebe Grüße,
Marvin
Hallo Marvin Esse,
Folgendes einfaches Script ergibt unverständlicherweise 0 anstatt der erwarteten 1.
Kann ich nicht bestätigen. http://sandbox.onlinephpfunctions.com/
Bis demnächst
Matthias
Moin!
Folgendes einfaches Script ergibt unverständlicherweise 0 anstatt der erwarteten 1.
Kann ich nicht bestätigen. http://sandbox.onlinephpfunctions.com/
Kann ich für alle PHP-Versionen seit 5.3.0 inklusive HHVM bestätigen.
https://3v4l.org/i9VXC
Grüße Sven
Tach!
Folgendes einfaches Script ergibt unverständlicherweise 0 anstatt der erwarteten 1.
Kann ich nicht bestätigen. http://sandbox.onlinephpfunctions.com/
Kann ich für alle PHP-Versionen seit 5.3.0 inklusive HHVM bestätigen.
https://3v4l.org/i9VXC
Wenn ihr euch auf eine gemeinsame Zeitzone einigen und diese explizit setzen würdet, dann bekämet ihr auch das gleiche Ergebnis.
dedlfix.
Moin,
Folgendes einfaches Script ergibt unverständlicherweise 0 anstatt der erwarteten 1.
$date1=date_create("2016-02-01"); $date2=date_create("2016-03-01"); $diff=date_diff($date1,$date2,true); echo $diff->format("%m");
Wenn ich bei $date2 anstelle vom März den April eintrage, dann wird korrekt "2" ausgegeben.
Hat jemand eine Erklärung?
ja, aber als reine Vermutung: Monate sind unterschiedlich lang. Da bei einer reinen Differenz aber der Kalenderbezug flötengeht, muss date_diff beim Berechnen der Monate von einer "typischen" Länge ausgehen, vermutlich 30. Der Februar hatte in diesem Jahr 29 Tage, also ergibt sich "weniger als 1 Monat" und das wird auf 0 abgerundet, während Februar und März in Summe 60 Tage hatten, also 2 Monate.
Ist das plausibel?
So long,
Martin
Hallo Martin,
ja, aber als reine Vermutung: Monate sind unterschiedlich lang. Da bei einer reinen Differenz aber der Kalenderbezug flötengeht, muss date_diff beim Berechnen der Monate von einer "typischen" Länge ausgehen, vermutlich 30. Der Februar hatte in diesem Jahr 29 Tage, also ergibt sich "weniger als 1 Monat" und das wird auf 0 abgerundet, während Februar und März in Summe 60 Tage hatten, also 2 Monate.
Das scheint es tatsächlich zu sein, denn Versuche mit anderen Daten, die nur 1 Monat auseinander liegen, funktioniert es bei mir auch einwandfrei.
Aber sehr merkwürdig, dass es in der geposteten onlinesandbox vom Matthias das Problem nicht gibt. Egal welche PHP-Version ich einstelle.
Gruß,
Marvin
Tach!
Das scheint es tatsächlich zu sein, denn Versuche mit anderen Daten, die nur 1 Monat auseinander liegen, funktioniert es bei mir auch einwandfrei.
Schau dir mal lieber das DateInterval-Objekt mit print_r() oder var_dump() vollständig an.
Aber sehr merkwürdig, dass es in der geposteten onlinesandbox vom Matthias das Problem nicht gibt. Egal welche PHP-Version ich einstelle.
echo date_create()->format('e');
dedlfix.
Hallo,
Was passiert bei dir, wenn du
a) eine anderes Jahr wählst oder
b) andere Tagesdaten nimmst?
Gruß
Kalk
Hi,
Was passiert bei dir, wenn du
a) eine anderes Jahr wählst
genau, das wäre interessant.
Sollte ich mit meiner These richtig liegen, müsste sich für den Zeitraum Februar+März z.B. in 2015 auch nur 1 Monat ergeben, weil es da nur 59 Tage waren.
b) andere Tagesdaten nimmst?
Sobald der Februar nicht im Intervall enthalten ist, wird das Problem vermutlich nicht auftreten, denn alle anderen Monate haben mindestens 30 Tage.
So long,
Martin
Tach!
Sobald der Februar nicht im Intervall enthalten ist, wird das Problem vermutlich nicht auftreten, denn alle anderen Monate haben mindestens 30 Tage.
Das sagst du so einfach. Als Differenz (in Zeitzone Europe/Berlin) zwischen 1.3.2016 und 1.4.2016 berechnet DateTime::diff() 1 Monat und 2 Tage, zwischen 1.5.2016 und 1.6.2016 hingegen 1 Monat und 1 Tag. In absoluten Tagen sind das aber in beiden Fällen 31.
dedlfix.
Hi,
Sobald der Februar nicht im Intervall enthalten ist, wird das Problem vermutlich nicht auftreten, denn alle anderen Monate haben mindestens 30 Tage.
Das sagst du so einfach. Als Differenz (in Zeitzone Europe/Berlin) zwischen 1.3.2016 und 1.4.2016 berechnet DateTime::diff() 1 Monat und 2 Tage
... weil durch die Umstellung auf Sommerzeit eine Stunde, also ein gerade so eben angebrochener Tag hinzukommt.
zwischen 1.5.2016 und 1.6.2016 hingegen 1 Monat und 1 Tag. In absoluten Tagen sind das aber in beiden Fällen 31.
Ja. Aber das ändert nichts an meiner Feststellung mit "mindestens 30 Tagen". Selbst im Oktober, wenn wieder auf Winterzeit umgestellt wird, bleiben es "mindestens 30 Tage". Nur der Februar fällt aus dem Rahmen.
Ciao,
Martin
Hallo,
ich brauch mal Eure Hilfe...
Folgendes einfaches Script ergibt unverständlicherweise 0 anstatt der erwarteten 1.
$date1=date_create("2016-02-01"); $date2=date_create("2016-03-01"); $diff=date_diff($date1,$date2,true); echo $diff->format("%m");
Wenn ich bei $date2 anstelle vom März den April eintrage, dann wird korrekt "2" ausgegeben.
Hat jemand eine Erklärung?
guckst Du Warnungen:
0PHP Warning: date_create(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Europe/Paris' for '2.0/DST'
date_default_timezone_set('Europe/Paris'); // Warnung weg, Ergebnis immer noch 0 aber besser zu sehen