Ankündigung

Einklappen
Keine Ankündigung bisher.

Anzahl Monatstage berechnen (Datumsdifferenz)

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

  • Anzahl Monatstage berechnen (Datumsdifferenz)

    Hallo,

    folgender Code funktioniert soweit einwandfrei:

    PHP-Code:
    <?php

    $start 
    = (new DateTime('2019-02-10'));
    $end = (new DateTime('2019-04-23'));

    $months = new DatePeriod($startDateInterval::createFromDateString('1 month'), $end);
    $days = new DatePeriod($startDateInterval::createFromDateString('1 day'), $end);

    echo 
    "<table>";

    echo 
    "<tr>";
    foreach (
    $months as $month){echo "<td colspan=X>".$month->format("M")."</td>";}
    echo 
    "</tr>";

    echo 
    "<tr>";
    foreach (
    $days as $day){echo "<td>".$day->format("d.m.")."</td>";}
    echo 
    "</tr>";

    echo 
    "</table>";

    ?>
    Was aber noch fehlt: Die colspan-Angabe für die Monate!

    Leider kann ich da nicht einfach die Gesamtzahl der Tage des jeweiligen Monats verwenden,
    da der Start- bzw. Endtag ja mittelst im Monat sein kann.

    Hat jemand eine Idee? Danke!


  • #2
    Anstelle mit echo sofort immer alles gleich auszugeben kannst du doch Variablen nutzen um HTML-Fragmente zu speichern. Dann könntest du mit den Tagen anfangen und diese einfach mitzählen bis ein neuer Monat kommt. Vom Grundsatz wie ein Gruppenbruch / Gruppenwechsel.
    Du kannst dir die Tage auch ausrechnen, hast aber wie du selber schon festgestellt hast eine Reihe von Fällen zu unterscheiden. Scheint mir mehr Aufwand zu sein.
    PHP-Klassen auf github

    Kommentar


    • #3
      Ich glaub der Gruppenbruch macht es nicht "unaufwendiger"

      PHP-Code:
      <?php

      $start 
      = (new DateTime('2019-02-10'));
      $end = (new DateTime('2019-04-23'));

      $months = new DatePeriod($startDateInterval::createFromDateString('1 month'), $end);
      $days = new DatePeriod($startDateInterval::createFromDateString('1 day'), $end);

      echo 
      "<table border=1>";

      echo 
      "<tr>";

      foreach (
      $days as $day){

          
      $erster_monat $day->format("m");

          
      // if(empty($letzer_monat)){$letzter_monat = $erster_monat;}

          
      $d++;

          if (
      $erster_monat != $letzter_monat)

          {
              echo 
      $day->format("m").": ".$d." Resttage<br>";
              unset(
      $d);
          }

          echo 
      "<td>".$day->format("d.m.")."</td>";

          
      $letzter_monat $erster_monat;

          }
      echo 
      "</tr>";

      echo 
      "</table>";

      ?>
      Das listet mir das hier auf:

      02: 1 Resttage
      03: 19 Resttage
      04: 31 Resttage

      Eigentlich soll es so aussehen:

      02: 19 Resttage
      03: 31 Resttage
      04: 23 Resttage

      Da der 1. Monat in der Schleife ja ersmtal unbekannt ist (also $letzter_monat nicht gesetzt), dachte ich das ausgeklammerte if(empty($letzer_monat)){$letzter_monat = $erster_monat;} würde es lösen.Stattdessen dann gar keine Ausgabe

      Auch fehlt sozusagen der letzte Monat April und wird bei dieser Art des Gruppenbruchs überhaupt nicht berücksichtigt .-(

      Kommentar


      • #4
        Den letzten Monat must du nach der Schleife ranhängen. Und du arbeitest ja wieder mit echo in deiner Verarbeitung. Nimm Variablen zum Puffern der "Ausgabe"
        PHP-Code:
        $htmlDays .= "<td>".$start->format("d.m.")."</td>"
        und mache ein echo am Ende.
        PHP-Code:
        echo '<table border=1>'.$htmlMonth.$htmlDays.'</table>'
        PHP-Klassen auf github

        Kommentar


        • #5
          Hab den Spieß jetzt mal umgedreht und lasse zuerst die Monate durchlaufen, darin die Tage:

          PHP-Code:
          <?php

          $start 
          = (new DateTime('2019-02-11'));
          $end = (new DateTime('2019-04-23'))->modify('+ 1 hour');

          $months = new DatePeriod($startDateInterval::createFromDateString('1 month'), $end);
          $days = new DatePeriod($startDateInterval::createFromDateString('1 day'), $end);

          setlocale(LC_TIME"de_DE.utf8");

          foreach (
          $months as $month){

            foreach (
          $days as $day)
              {
                if(
          $month->format("M")==$day->format("M")){


                        if(
          in_array($day->format("w"),array(0,5,6)))
                        {
          $tage.="<td bgcolor=red>";}else{$tage.="<td>";}
                        
          $tage.=$day->format("d.m.")."</td>";

                        
          $d++;

                      }
              }

            
          $titel.="<th colspan=".$d.">".$month->format("F")."</th>";

            unset(
          $d);

          }

          echo 
          "<table border=1><tr>".$titel."</tr>";
          echo 
          "<tr>".$tage."</tr>";
          echo 
          "</table>";

          ?>
          Das funktioniert einwandfrei, danke für den Tipp wegen den Gruppen!

          PS: Das setlocale() hat keinerlei Einfluss auf die Date-Klasse oder? Die Monatsnamen sollten eigentlich Deutsch ausgegen werden. Ist da wirklich immer noch dieser Workaround mit den "Monatsnamen-Array" nötig?

          Kommentar


          • #6
            bgcolor ist veraltet.

            Validiere deine Code der ausgegeben wird und behebe deine Fehler.
            https://validator.w3.org/

            Für andere Sprachausgaben brauchst du die IntlDateFormatter Class
            http://php.net/manual/en/intldateformatter.format.php

            Kommentar

            Lädt...
            X