Pit: Seltsame Ausgabe bei php-Datums und Zeitfunktionen

Hallo Forum,

ich dachte immer, dass "Y" und "y" bei strtotime() gleichermaßen gehen? Ich kann mir folgenden Unterschied nicht erklären:

<?php
// mktime(hour, min, sec, month, day, year);
$startTime = mktime(10, 30, 0, 12, 15, 2017); // 15.12.2017 10:30:00 Uhr
$endTime = mktime(10, 30, 0, 01, 20, 2018); // 20.01.2018 10:30:00 Uhr
$neuesDatumTimestamp = $startTime;

echo ("Ausgabe 1:<br>");
$dayAdd = 0;
while (strtotime(date("d.m.Y",$neuesDatumTimestamp)) < strtotime(date("d.m.Y",$endTime))) {
  $myTag = date('d', strtotime('+'.$dayAdd.' day', $startTime));
  $myMonat = date('m', strtotime('+'.$dayAdd.' day', $startTime));
  $myJahr = date('Y', strtotime('+'.$dayAdd.' day', $startTime));
     $neuesDatum = $myTag.".".$myMonat.".".$myJahr;
	 $neuesDatumTimestamp = strtotime($neuesDatum);
	 echo ($neuesDatum."<br>");
$dayAdd ++;
}

$startTime = mktime(10, 30, 0, 12, 15, 2017); // 15.12.2017 10:30:00 Uhr
$endTime = mktime(10, 30, 0, 01, 20, 2018); // 20.01.2018 10:30:00 Uhr
$neuesDatumTimestamp = $startTime;

echo ("<br><br>Ausgabe 2:<br>");
$dayAdd = 0;
while (strtotime(date("d.m.y",$neuesDatumTimestamp)) < strtotime(date("d.m.y",$endTime))) {
  $myTag = date('d', strtotime('+'.$dayAdd.' day', $startTime));
  $myMonat = date('m', strtotime('+'.$dayAdd.' day', $startTime));
  $myJahr = date('Y', strtotime('+'.$dayAdd.' day', $startTime));
     $neuesDatum = $myTag.".".$myMonat.".".$myJahr;
	 $neuesDatumTimestamp = strtotime($neuesDatum);
	 echo ($neuesDatum."<br>");
$dayAdd ++;
}


$startTime = mktime(10, 30, 0, 12, 15, 2017); // 15.12.2017 10:30:00 Uhr
$endTime = mktime(10, 30, 0, 01, 25, 2018); // 20.01.2018 10:30:00 Uhr
$neuesDatumTimestamp = $startTime;

echo ("<br><br>Ausgabe 3:<br>");
$dayAdd = 0;
while (strtotime(date("d.m.y",$neuesDatumTimestamp)) < strtotime(date("d.m.y",$endTime))) {
  $myTag = date('d', strtotime('+'.$dayAdd.' day', $startTime));
  $myMonat = date('m', strtotime('+'.$dayAdd.' day', $startTime));
  $myJahr = date('Y', strtotime('+'.$dayAdd.' day', $startTime));
     $neuesDatum = $myTag.".".$myMonat.".".$myJahr;
	 $neuesDatumTimestamp = strtotime($neuesDatum);
	 echo ($neuesDatum."<br>");
$dayAdd ++;
}

Ausgaben:

Ausgabe 1:
15.12.2017
16.12.2017
17.12.2017
...
20.01.2018


Ausgabe 2:
15.12.2017
16.12.2017
17.12.2017
18.12.2017
19.12.2017
20.12.2017


Ausgabe 3:
15.12.2017
16.12.2017
17.12.2017
...
25.01.2018

Ausgabe 1 ist korrekt.

Ausgabe 2 mag auch korrekt sein, ist aber für mich unerwartet 😉

Ausgabe 3 sieht korrekt aus, ist aber aufgrund von Ausgabe 2 für mich unerwartet…

Kann mir einer erklären, warum

Ausgabe 2 mit "y" und 20.01.2018 bereits am 20.01.2017 abbricht und

Ausgabe 3 mit "y" und 25.01.2018 nicht abbricht, sondern bis zum 25.01.2018 durchläuft?

Pit

  1. Bei mir erzeugt Dein Code jede Menge Warnungen. Kümmere Dich zunächst mal darum würde ich sagen und dann versuche mal etwas besser herauszuarbeiten, worin das eigentliche Problem besteht. MfG

    1. Tach!

      Bei mir erzeugt Dein Code jede Menge Warnungen.

      Sag bloß nicht, welche das sind, das könnte hilfreich sein. Besonders wenn sie anderenorts aufgrund eines besser konfigurierten PHPs nicht auftreten.

      Vermutlich handelt es sich wohl um die Warnung, dass keine Zeitzone gesetzt ist. Wenn das der Fall ist, bekommt man das im Script mit dem Aufruf der Funktion date_default_timezone_set() gelöst. Oder man stellt das in seiner php.ini (oder .user.ini) mittels date.timezone ein.

      dedlfix.

      1. Tach!

        Bei mir erzeugt Dein Code jede Menge Warnungen.

        Sag bloß nicht, welche das sind, das könnte hilfreich sein.

        Nein. Hilfreich wäre, wenn die Warnungen einer Problembeschreibung beigefügt sind. Ich habe jedoch weder das Eine noch das Andere hier vorgefunden.

        Und noch etwas: Wer mit dem Datum rechnen will, braucht keine Zeitzone sondern einen Kalender. Ich würde von PHP, was mit dem Datum rechnen kann, höchstens erwarten, das es nicht nach der Zeitzone fragt, sondern nach dem Kalender nach dem gerechnet werden soll.

        MfG

        1. Tach!

          Bei mir erzeugt Dein Code jede Menge Warnungen.

          Sag bloß nicht, welche das sind, das könnte hilfreich sein.

          Nein. Hilfreich wäre, wenn die Warnungen einer Problembeschreibung beigefügt sind. Ich habe jedoch weder das Eine noch das Andere hier vorgefunden.

          Wenn es sich um die Zeitzonenwarnungen handelt, dann treten die eben nicht auf, wenn man sein PHP richtig konfiguriert. Sie sind auch nicht Teil des Problems. Deswegen wäre es schon wichtig, dass du sagt, welche Meldungen bei dir auftreten, denn das sind nicht zwangsläufig (die) Meldungen, die in anderen Umgebungen auftreten.

          Und noch etwas: Wer mit dem Datum rechnen will, braucht keine Zeitzone sondern einen Kalender. Ich würde von PHP, was mit dem Datum rechnen kann, höchstens erwarten, das es nicht nach der Zeitzone fragt, sondern nach dem Kalender nach dem gerechnet werden soll.

          Dann hast du andere Erwartungen. Für die meisten Fälle reicht es, dass man den aktuell gültigen Kalender berücksichtigt und keinen weiteren. Datums- und Zeitberechnungen basieren in PHP auf dem Unix-Timestamp. Es ist hingegen schon wichtig, wie man lokale Zeiten in diesen Unix-Timestamp umwandelt, weil man dabei die Zeitzone berücksichtigen muss. Wenn man stattdessen nur mit UTC arbeiten möchte, muss man die gm-Funktionen nehmen.

          dedlfix.

          1. Tach!

            Bei mir erzeugt Dein Code jede Menge Warnungen.

            Sag bloß nicht, welche das sind, das könnte hilfreich sein.

            Nein. Hilfreich wäre, wenn die Warnungen einer Problembeschreibung beigefügt sind. Ich habe jedoch weder das Eine noch das Andere hier vorgefunden.

            Wenn es sich um die Zeitzonenwarnungen handelt, dann treten die eben nicht auf, wenn man sein PHP richtig konfiguriert. Sie sind auch nicht Teil des Problems.

            Doch sie sind es! In dem Moment nämlich wenn man einen Haufen Code bekommt und damit das Problem nachstellen möchte. Da möchte man schon wissen, was man zur Ausführung des Codes noch zu konfigurieren hat. MfG

            1. Tach!

              Nein. Hilfreich wäre, wenn die Warnungen einer Problembeschreibung beigefügt sind. Ich habe jedoch weder das Eine noch das Andere hier vorgefunden.

              Wenn es sich um die Zeitzonenwarnungen handelt, dann treten die eben nicht auf, wenn man sein PHP richtig konfiguriert. Sie sind auch nicht Teil des Problems.

              Doch sie sind es! In dem Moment nämlich wenn man einen Haufen Code bekommt und damit das Problem nachstellen möchte. Da möchte man schon wissen, was man zur Ausführung des Codes noch zu konfigurieren hat.

              Jetzt hör endlich auf zu lamentieren und sag, welche Meldungen es bei dir sind. Falls es die Zeitzonenmeldungen sind, da steht im Text drin, was da zu konfigurieren ist.

              dedlfix.

              1. Tach!

                Nein. Hilfreich wäre, wenn die Warnungen einer Problembeschreibung beigefügt sind. Ich habe jedoch weder das Eine noch das Andere hier vorgefunden.

                Wenn es sich um die Zeitzonenwarnungen handelt, dann treten die eben nicht auf, wenn man sein PHP richtig konfiguriert. Sie sind auch nicht Teil des Problems.

                Doch sie sind es! In dem Moment nämlich wenn man einen Haufen Code bekommt und damit das Problem nachstellen möchte. Da möchte man schon wissen, was man zur Ausführung des Codes noch zu konfigurieren hat.

                Jetzt hör endlich auf zu lamentieren und sag, welche Meldungen es bei dir sind. Falls es die Zeitzonenmeldungen sind, da steht im Text drin, was da zu konfigurieren ist.

                Nein es steht nicht in den Meldungen was zu konfigurieren ist. Das sollte mir schon derjenige mitteilen der das Problem gelöst haben möchte. MfG

                1. Tach!

                  Jetzt hör endlich auf zu lamentieren und sag, welche Meldungen es bei dir sind. Falls es die Zeitzonenmeldungen sind, da steht im Text drin, was da zu konfigurieren ist.

                  Nein es steht nicht in den Meldungen was zu konfigurieren ist. Das sollte mir schon derjenige mitteilen der das Problem gelöst haben möchte.

                  Vielen Dank fürs Gespräch!

                  dedlfix.

                2. Tach!

                  Jetzt hör endlich auf zu lamentieren und sag, welche Meldungen es bei dir sind. Falls es die Zeitzonenmeldungen sind, da steht im Text drin, was da zu konfigurieren ist.

                  Nein es steht nicht in den Meldungen was zu konfigurieren ist. Das sollte mir schon derjenige mitteilen der das Problem gelöst haben möchte.

                  Da du ja so überaus hilfreich mit deinen Antworten bist, geb ich dir auch eine überaus hilfreiche Lösung des Problems:

                  ini_set('display_errors', 0);

                  dedlfix.

                  1. Hallo,

                    ini_set('display_errors', 0);

                    Feature-Request: forum_set('display_pl', 0);

                    Gruß
                    Kalk

                  2. Tach!

                    Jetzt hör endlich auf zu lamentieren und sag, welche Meldungen es bei dir sind. Falls es die Zeitzonenmeldungen sind, da steht im Text drin, was da zu konfigurieren ist.

                    Nein es steht nicht in den Meldungen was zu konfigurieren ist. Das sollte mir schon derjenige mitteilen der das Problem gelöst haben möchte.

                    Da du ja so überaus hilfreich mit deinen Antworten bist, geb ich dir auch eine überaus hilfreiche Lösung des Problems:

                    Der Code erzeugt bei der Ausführung 953 Fehlermeldungen. Ich habe noch nie erlebt, daß hier jemand so etwas Unausgereiftes abliefert und es dann noch nicht einmal für nötig hält, mitzuteilen welche Zeitzone zu konfigurieren ist.

                    ini_set('display_errors', 0);

                    Nein, das hilft nicht. Möchtest Du als Nächstes vielleicht raten welche Zeitzone zu konfigurieren ist?

                    Schönen Tag auch.

                    1. Der Code erzeugt bei der Ausführung 953 Fehlermeldungen.

                      Nein, tut er nicht, du machst was falsch. Da du auf die Nachfragen nicht reagierst kann man dir nicht helfen.

                3. Hallo pl,

                  Tach!

                  Nein. Hilfreich wäre, wenn die Warnungen einer Problembeschreibung beigefügt sind. Ich habe jedoch weder das Eine noch das Andere hier vorgefunden.

                  Wenn es sich um die Zeitzonenwarnungen handelt, dann treten die eben nicht auf, wenn man sein PHP richtig konfiguriert. Sie sind auch nicht Teil des Problems.

                  Doch sie sind es! In dem Moment nämlich wenn man einen Haufen Code bekommt und damit das Problem nachstellen möchte. Da möchte man schon wissen, was man zur Ausführung des Codes noch zu konfigurieren hat.

                  Jetzt hör endlich auf zu lamentieren und sag, welche Meldungen es bei dir sind. Falls es die Zeitzonenmeldungen sind, da steht im Text drin, was da zu konfigurieren ist.

                  Nein es steht nicht in den Meldungen was zu konfigurieren ist. Das sollte mir schon derjenige mitteilen der das Problem gelöst haben möchte. MfG

                  Spinner.

                  Bis demnächst
                  Matthias

                  --
                  Rosen sind rot.
                  1. Hallo,

                    Nein es steht nicht in den Meldungen was zu konfigurieren ist. Das sollte mir schon derjenige mitteilen der das Problem gelöst haben möchte. MfG

                    Spinner.

                    Aha. Und Ihr wollt hier Probleme lösen? Welch Arroganz und Überheblichkeit! MfG

                    1. Hallo pl,

                      Nein es steht nicht in den Meldungen was zu konfigurieren ist. Das sollte mir schon derjenige mitteilen der das Problem gelöst haben möchte. MfG

                      Spinner.

                      Aha. Und Ihr wollt hier Probleme lösen? Welch Arroganz und Überheblichkeit! MfG

                      Kann ich nicht entdecken, höchstens auf deiner Seite, da du auf mehrfache Nachfrage nicht den Wortlaut der bei dir auftretenden Fehlermeldungen lieferst - Mehr werde ich dazu nicht sagen.

                      Bis demnächst
                      Matthias

                      --
                      Rosen sind rot.
                      1. Hallo pl,

                        Nein es steht nicht in den Meldungen was zu konfigurieren ist. Das sollte mir schon derjenige mitteilen der das Problem gelöst haben möchte. MfG

                        Spinner.

                        Aha. Und Ihr wollt hier Probleme lösen? Welch Arroganz und Überheblichkeit! MfG

                        Kann ich nicht entdecken, höchstens auf deiner Seite, da du auf mehrfache Nachfrage nicht den Wortlaut der bei dir auftretenden Fehlermeldungen lieferst - Mehr werde ich dazu nicht sagen.

                        Ich hätte jetzt eher eine Entschuldigung erwartet!

                        1. Hallo pl,

                          Ich hätte jetzt eher eine Entschuldigung erwartet!

                          Ja, ich würde auch erwarten, dass du dich entschuldigst.

                          LG,
                          CK

    2. Bei mir erzeugt Dein Code jede Menge Warnungen.

      Ich habe

      error_reporting(E_ALL);
      ini_set('display_errors', 1);
      

      unterhalb der Startzeile <?php eingefügt.

      Mit php7.0 (cli) sah keine einzige Warnung.

      Mit hhvm sah ich dann aber sehr viele davon:

      Strict Warning: It is not safe to rely on the system's timezone settings. Please use the date.timezone setting, the TZ environment variable 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/Berlin' for 'CET/1.0/no DST' instead in /tmp/test.php on line 45
      

      Nachdem ich

      ini_set("date.timezone","GMT");
      # Alternative: ini_set("date.timezone","Europe/Berlin");
      

      einfügte waren diese weg. Und haben mit dem gezeigten Problem leider nichts zu tun.

      so.

      Ich habe das Skript in Abschnitt 2 mal angepasst.

      while (strtotime(date("d.m.Y",$neuesDatumTimestamp)) < strtotime(date("d.m.Y",$endTime))) {
      

      hier also bewusst das große Y verwendet um die komplette Iteration durchzuführen. dann habe ich Ausgaben eingebaut:

        echo "y: " . date( "Y-m-d", strtotime( date("d.m.y", $neuesDatumTimestamp ) ) ) . " < ",  date( "Y-m-d", strtotime( date( "d.m.y",$endTime ) ) ) . "\n";
        echo "Y: " . date( "Y-m-d", strtotime( date("d.m.Y", $neuesDatumTimestamp ) ) ) . " < ",  date( "Y-m-d", strtotime( date( "d.m.Y",$endTime ) ) ) . "\n";
        
        $myTag = date('d', strtotime('+'.$dayAdd.' day', $startTime));
        $myMonat = date('m', strtotime('+'.$dayAdd.' day', $startTime));
        $myJahr = date('Y', strtotime('+'.$dayAdd.' day', $startTime));
           $neuesDatum = $myTag.".".$myMonat.".".$myJahr;
      	 $neuesDatumTimestamp = strtotime($neuesDatum);
      	 echo ($neuesDatum."\n");
      $dayAdd ++;
      }
      

      Und folgende Ausgaben erhalten:

      Ausgabe 2:
      y: 2017-12-12 < 2017-12-12
      Y: 2017-12-15 < 2018-01-20
      15.12.2017
      y: 2017-12-12 < 2017-12-12
      Y: 2017-12-15 < 2018-01-20
      16.12.2017
      y: 2017-12-12 < 2017-12-12
      Y: 2017-12-16 < 2018-01-20
      17.12.2017
      y: 2017-12-12 < 2017-12-12
      Y: 2017-12-17 < 2018-01-20
      18.12.2017
      y: 2017-12-12 < 2017-12-12
      Y: 2017-12-18 < 2018-01-20
      19.12.2017
      y: 2017-12-12 < 2017-12-12
      Y: 2017-12-19 < 2018-01-20
      20.12.2017
      y: 2017-12-12 < 2017-12-12
      Y: 2017-12-20 < 2018-01-20
      21.12.2017
      y: 2017-12-12 < 2017-12-12
      Y: 2017-12-21 < 2018-01-20
      22.12.2017
      y: 2017-12-12 < 2017-12-12
      Y: 2017-12-22 < 2018-01-20
      23.12.2017
      y: 2017-12-12 < 2017-12-12
      Y: 2017-12-23 < 2018-01-20
      24.12.2017
      y: 2017-12-13 < 2017-12-12
      Y: 2017-12-24 < 2018-01-20
      25.12.2017
      y: 2017-12-25 < 2017-12-12
      Y: 2017-12-25 < 2018-01-20
      26.12.2017
      y: 2017-12-26 < 2017-12-12
      Y: 2017-12-26 < 2018-01-20
      27.12.2017
      y: 2017-12-27 < 2017-12-12
      Y: 2017-12-27 < 2018-01-20
      28.12.2017
      y: 2017-12-28 < 2017-12-12
      Y: 2017-12-28 < 2018-01-20
      29.12.2017
      y: 2017-12-29 < 2017-12-12
      Y: 2017-12-29 < 2018-01-20
      30.12.2017
      y: 2017-12-30 < 2017-12-12
      Y: 2017-12-30 < 2018-01-20
      31.12.2017
      y: 2017-12-31 < 2017-12-12
      Y: 2017-12-31 < 2018-01-20
      01.01.2018
      y: 2017-12-12 < 2017-12-12
      Y: 2018-01-01 < 2018-01-20
      02.01.2018
      y: 2017-12-12 < 2017-12-12
      Y: 2018-01-02 < 2018-01-20
      03.01.2018
      y: 2017-12-12 < 2017-12-12
      Y: 2018-01-03 < 2018-01-20
      04.01.2018
      y: 2017-12-12 < 2017-12-12
      Y: 2018-01-04 < 2018-01-20
      05.01.2018
      y: 2017-12-12 < 2017-12-12
      Y: 2018-01-05 < 2018-01-20
      06.01.2018
      y: 2017-12-12 < 2017-12-12
      Y: 2018-01-06 < 2018-01-20
      07.01.2018
      y: 2017-12-12 < 2017-12-12
      Y: 2018-01-07 < 2018-01-20
      08.01.2018
      y: 2017-12-12 < 2017-12-12
      Y: 2018-01-08 < 2018-01-20
      09.01.2018
      y: 2017-12-12 < 2017-12-12
      Y: 2018-01-09 < 2018-01-20
      10.01.2018
      y: 2017-12-12 < 2017-12-12
      Y: 2018-01-10 < 2018-01-20
      11.01.2018
      y: 2017-12-12 < 2017-12-12
      Y: 2018-01-11 < 2018-01-20
      12.01.2018
      y: 2017-12-12 < 2017-12-12
      Y: 2018-01-12 < 2018-01-20
      13.01.2018
      y: 2017-12-12 < 2017-12-12
      Y: 2018-01-13 < 2018-01-20
      14.01.2018
      y: 2017-12-12 < 2017-12-12
      Y: 2018-01-14 < 2018-01-20
      15.01.2018
      y: 2017-12-12 < 2017-12-12
      Y: 2018-01-15 < 2018-01-20
      16.01.2018
      y: 2017-12-12 < 2017-12-12
      Y: 2018-01-16 < 2018-01-20
      17.01.2018
      y: 2017-12-12 < 2017-12-12
      Y: 2018-01-17 < 2018-01-20
      18.01.2018
      y: 2017-12-12 < 2017-12-12
      Y: 2018-01-18 < 2018-01-20
      19.01.2018
      y: 2017-12-12 < 2017-12-12
      Y: 2018-01-19 < 2018-01-20
      20.01.2018
      

      Jetzt kannst Du selbst nachsehen, welcher Hase da wohin läuft. Und hoffentlich fällt endlich jemanden auf, dass es viel zu teuer ist, strtotime() zu verwenden und sich auf die korrekte Interpretierung eines Haufens dokumentierter Formate zu verlassen wenn Tag, Monat und Jahr bekannt sind.

      1. Tach!

        Jetzt kannst Du selbst nachsehen, welcher Hase da wohin läuft. Und hoffentlich fällt endlich jemanden auf, dass es viel zu teuer ist, strtotime() zu verwenden

        Du meinst so wie in "Also wäre Ymd eine geeignetere Formatierung, weil die sofort verglichen werden kann, ohne erst wieder einen Timestamp aus dem formatierten Wert zu parsen."

        dedlfix.

        1. Tatsächlich. date("Ymd", $timestamp) oder intval(date("Ymd", $timestamp)) wäre - für den hier durchgeführten Vergleich - die mit Abstand billigste Lösung.

          Ich weiß nicht recht wie man auf andere Ideen kommt. Ich hätte hier aber der Verwendung von mktime() noch zugestimmt,

          for ($i=0; $i<4; $i++) {
              echo ( date( 'Y-m-d', mktime( 0, 0, 0, 12, 30 + $i, 2017 ) ) . "\n" );
          }
          

          Ausgaben:

          2017-12-30
          2017-12-31
          2018-01-01
          2018-01-02
          

          weil, wenn die Tage in der Iteration dreistellig werden, der Vergleich als Zahl womöglich zu einem Problem führt.

      2. hi,

        Nachdem ich

        ini_set("date.timezone","GMT");
        # Alternative: ini_set("date.timezone","Europe/Berlin");
        

        einfügte waren diese weg. Und haben mit dem gezeigten Problem leider nichts zu tun.

        Das mag schon sein. Aber Dir ist klar, daß GMT und Europe/Berlin verschiedene Zeitzonen sind? Und daß wenn man mktime() benutzt die Zeitzone schon eine Rolle spielt? Untenstehender Code liefert 3 verschiedene Ergebnisse!

        ini_set("date.timezone","GMT");
        echo mktime(0,0,0,1,1,1970),"\n";
        
        date_default_timezone_set('Europe/Berlin');
        echo mktime(0,0,0,1,1,1970),"\n";
        
        date_default_timezone_set('Australia/Darwin');
        echo mktime(0,0,0,1,1,1970),"\n";
        

        MfG

        1. <?php
          ini_set("date.timezone","GMT");
          echo date('Y-m-d H:i:s', mktime(0,0,0,1,1,1970)),"\t", mktime(0,0,0,1,1,1970), "\n";
          
          date_default_timezone_set('Europe/Berlin');
          echo date('Y-m-d H:i:s', mktime(0,0,0,1,1,1970)),"\t", mktime(0,0,0,1,1,1970), "\n";
          
          date_default_timezone_set('Australia/Darwin');
          echo date('Y-m-d H:i:s', mktime(0,0,0,1,1,1970)),"\t", mktime(0,0,0,1,1,1970), "\n";
          

          Ergebnis:

          1970-01-01 00:00:00     0
          1970-01-01 00:00:00     -3600
          1970-01-01 00:00:00     -34200
          
          

          Wahnsinnig neu und interessant: Wenn man mktime() benutzt spielt die Zeitzone die selbe Rolle wie bei date()

  2. Tach!

    ich dachte immer, dass "Y" und "y" bei strtotime() gleichermaßen gehen?

    Nein. Eine zweistellige Jahresanzahl ist nicht eindeutig, besonders nicht beim Rechnen damit und einem Automaten, der aus einer beliebigen Zeichenfolge einen korrekten Datums- und Zeitwert ermitteln soll.

    
    > while (strtotime(date("d.m.Y",$neuesDatumTimestamp)) < strtotime(date("d.m.Y",$endTime))) {
    
    

    Das ist recht umständlich. Du willst nur den Datumsanteil. Leider gibt es da auch in der objektorientierten Variante keine Methode, die nur den einen oder den anderen Teil im Rohformat liefert. Man muss da wohl immer über die Formatierung gehen, um Teile zu extrahieren. Aber du brauchst an der Stelle kein menschenlesbar formatiertes Datum, sondern eins, mit dem du einen Vergeich anstellen kannst. Also wäre Ymd eine geeignetere Formatierung, weil die sofort verglichen werden kann, ohne erst wieder einen Timestamp aus dem formatierten Wert zu parsen.

    Denn dabei tritt etwas unerwartetes auf. Füg mal hinter die while-Zeile folgende Kontrollausgaben ein:

      echo date("d.m.Y",$neuesDatumTimestamp)."<br>";
      echo date("d.m.Y H:i:s",strtotime(date("d.m.y",$neuesDatumTimestamp)))."<br>";
    

    Die erste kontrolliert den originalen Wert. Die zweite kontrolliert den Wert nach dem Parsen.

    Mit den Kontrollausgaben kannst du sehen, dass strtotime() da was anderes erkennt, als du erwartest. Konsequenz: Immer mit vollständigen Jahreszahlen arbeiten. Und bei Automatismen immer sehr skeptisch kontrollieren, dass sie richtig arbeiten. Im Falle von strtotime() empfiehlt es sich, eine relativ eindeutige Variante zu nehmen. Das ist zum einen eine vierstelliges Jahreszahl, und zum anderen das Format Y-m-d, das noch am sichersten erkannt wird.

    dedlfix.

    1. Hi dedlfix,

      Das ist recht umständlich. Du willst nur den Datumsanteil.

      Genau so ist es.

      Denn dabei tritt etwas unerwartetes auf. Füg mal hinter die while-Zeile folgende Kontrollausgaben ein:

        echo date("d.m.Y",$neuesDatumTimestamp)."<br>";
        echo date("d.m.Y H:i:s",strtotime(date("d.m.y",$neuesDatumTimestamp)))."<br>";
      

      Die erste kontrolliert den originalen Wert. Die zweite kontrolliert den Wert nach dem Parsen.

      Mit den Kontrollausgaben kannst du sehen, dass strtotime() da was anderes erkennt, als du erwartest.

      Aua! Aber nicht nur dort, wo nachweislich ohnehin etwas "Falsches" (im Sinne von unerartetem) herauskommt, sondern glatt überall, also in allen 3 Fällen!

      Das ist zum einen eine vierstelliges Jahreszahl, und zum anderen das Format Y-m-d, das noch am sichersten erkannt wird.

      Und erst die Verwendung von Y-m-d korrigiert es wieder. Unglaublich…

      Danke für die Hilfe,

      Pit