Marvin Esse: Fehler im PHP date_diff?

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

  1. 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

    --
    Dieses Forum nutzt Markdown. Im Wiki erhalten Sie Hilfe bei der Formatierung Ihrer Beiträge.
    1. 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

      1. 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.

  2. 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

    --
    Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
    - Douglas Adams, The Hitchhiker's Guide To The Galaxy
    1. 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

      1. 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.

      2. Hallo,

        Was passiert bei dir, wenn du
        a) eine anderes Jahr wählst oder
        b) andere Tagesdaten nimmst?

        Gruß
        Kalk

        1. 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

          --
          Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
          - Douglas Adams, The Hitchhiker's Guide To The Galaxy
          1. 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.

            1. 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

              --
              Nothing travels faster than the speed of light with the possible exception of bad news, which obeys its own special laws.
              - Douglas Adams, The Hitchhiker's Guide To The Galaxy
  3. 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
    
    
    
    --
    Schneckentempo? Läuft denen auch die Nase?