Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Info: DateTime Interval - Bug bei Tagen mit Zeitumstellung

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [Erledigt] Info: DateTime Interval - Bug bei Tagen mit Zeitumstellung

    Nachdem es hier immer wieder mal so Infos gibt.. ich hoffe damit keinen "alten Hund" auszugraben, bin gerade wegen einem anderen Thread darüber gestolpert - zur Info falls relevant:

    Scheinbar hat PHP da noch einen Bug bei der Differenzberechnung an Tagen mit Zeitumstellung. Beides mal das selbe Resultat, Stundenanteil der Differenz bei beiden 9, richtig wäre aber 9 und 10 beim unteren Beispiel wegen Zeitumstellung.

    PHP-Code:
    $tz = new DateTimeZone("Europe/Berlin"); 

    // heute 
    $dtFrom = new DateTime("00:00:00"$tz); // "2015-01-14 00:00:00" 
    $dtTo   = new DateTime("09:23:13"$tz); // "2015-01-14 09:23:13" 
    $int $dtFrom->diff($dtTo); 
    #var_dump($int); 
    echo $int->h// 9


    // die Umstellung auf die Winterzeit 2014 war am 26. Oktober, 
    $dtFrom = new DateTime("2014-10-26 00:00:00"$tz); 
    $dtTo   = new DateTime("2014-10-26 09:23:13"$tz); 
    $int $dtFrom->diff($dtTo); 
    #var_dump($int); 
    echo $int->h// 9 
    Hab dazu auch das gefunden https://bugs.php.net/bug.php?id=61530

    EDIT:

    Ah, ab 5.5.18 ist es ein anderes Ergebnis, scheinbar wirklch ein Bug, der mittlerweile gefixt wurde

    http://sandbox.onlinephpfunctions.co...d3ba0779fbe1b0

    PHP-Code:
    object(DateInterval)#4 (15) {
      
    ...
      [
    "h"]=>
      
    int(9)
      ...
    }

    object(DateInterval)#3 (15) {
     
    ...
      [
    "h"]=>
      
    int(10)
     ...

    LG
    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

  • #2
    Zitat von hausl Beitrag anzeigen
    Ah, ab 5.5.18 ist es ein anderes Ergebnis
    Ist mir neu. Die DateTime-Methode liefert(e) für mich die Differenz immer so wie wir die Uhr ablesen. s.a. Thread Zeitfehler.

    Kommentar


    • #3
      strtotime() machte es "vorher" auch schon "richtig"

      PHP-Code:
      // PHP 5.3.3
      date_default_timezone_set('Europe/Berlin'); 


      $t "09:23:13"
      echo 
      strtotime($t) - strtotime('00:00:00'); 
      // 33793 


      // Test Winterzeit 
      echo strtotime('2014-10-26 09:23:13') - strtotime('2014-10-26 00:00:00'); 
      // 37393 
      The string "()()" is not palindrom but the String "())(" is.

      Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
      PHP.de Wissenssammlung | Kein Support per PN

      Kommentar


      • #4
        Alles was über einen Timestamp(GMT) läuft muß die echt verstrichene Zeit liefern.
        Hab dafür in meiner Erweiterung dafür jetzt 2 getrennte Methoden:
        PHP-Code:
        $f "2014-10-26 00:00:00";
        $t "2014-10-26 09:00:00"
        echo 
        dt::create($f)->diffTotal($t,'Hour');  //9
        echo dt::create($f)->diffUTC($t,'Hour');  //10 
        Bis 5.5.5 ist noch alles beim Alten.

        Edit: mit 5.5.18:
        PHP-Code:
        $tz = new DateTimeZone("Europe/Berlin");  

        // die Umstellung auf die Winterzeit 2014 war am 26. Oktober,  
        $dtFrom = new DateTime("2014-10-25 09:23:13"$tz);  
        $dtTo   = new DateTime("2014-10-26 08:23:13"$tz);  
        $int $dtFrom->diff($dtTo);  
        echo 
        $int->days.' Tage '.$int->h.' Stunden'."\n";  //0 Tage 24 Stunden 

        $dtFrom = new DateTime("2014-10-25 09:23:13"$tz);
        $dtTo   = new DateTime("2014-10-26 09:23:13"$tz);  
        $int $dtFrom->diff($dtTo);  
        echo 
        $int->days.' Tage '.$int->h.' Stunden'."\n"//1 Tage 0 Stunden

        $dtFrom = new DateTime("2014-10-25 09:23:13"$tz);
        $dtTo   = new DateTime("2014-10-26 10:23:13"$tz);  
        $int $dtFrom->diff($dtTo);  
        echo 
        $int->days.' Tage '.$int->h.' Stunden'."\n";   //1 Tage 1 Stunden 
        Umgangssprchlich sind die Ergebnisse plausibel, nur rechnen kann man damit nicht, da die Tage unterschiedlich lang sind .

        LG jspit

        Kommentar


        • #5
          Ausser einigen offenen Bugs zu diesem Thema in die Richtung konnte ich nichts vernünftiges finden, auch nicht in den ChanceLogs von PHP etc..

          Eben ist mir nochwas seltsames aufgefallen:

          Dieser Code:

          PHP-Code:
          echo phpversion()."<br>\n";

          $tz = new DateTimeZone('Europe/Berlin');

          $dt1 date_create('2014-10-26 00:00:00'$tz);
          $dt2 date_create('2014-10-26 09:00:00'$tz);

          echo 
          date_diff($dt2$dt1)->h
          Hier getestet http://phptester.net/

          mit 5.4
          Code:
          // 5.4.35
          // 10
          Und hier http://sandbox.onlinephpfunctions.com/

          mit 5.4.4
          Code:
          5.4.4
          9
          mit 5.5.5
          Code:
          5.5.5
          9
          mit unter 5.5.18
          Code:
          5.5.18
          10
          Wie passt denn das zu dem Ergebnis von der oberen Seite, wo es unter 5.4 schon 10 ausgegeben wird, find ich irgendwo seltsam. Ev. ein OS Hintergrund? PHP-Config ja eher nicht, nachdem die Zeitzone ja explizit angegeben wird.
          The string "()()" is not palindrom but the String "())(" is.

          Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
          PHP.de Wissenssammlung | Kein Support per PN

          Kommentar

          Lädt...
          X