Ankündigung

Einklappen
Keine Ankündigung bisher.

Aktuellen Monat plus 1 Monat dazurechnen

Einklappen

Neue Werbung 2019

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

  • Aktuellen Monat plus 1 Monat dazurechnen

    Hallo liebe Freunde,
    mit einem kleinen Skript lese ich den aktuellen Monat aus.
    Gerne würde ich aber deinen Monat danach auswählen.
    Kann mir jemand einen Tipp geben wie ich meinen Skript verändern muss.
    Vielen Dank für eure Hilfe!

    PHP-Code:
      <?php

        
    if ($_GET['datum']<>"") {

          
    $monat_auswahl $_GET['monat'];
        } else {

          
    $monat_auswahl $month date("mm");
        }

        
    error_reporting(-1);

        
    date_default_timezone_set'Europe/Berlin' );
        include 
    'monat.php';

      
    ?>

  • #2
    Der Code ergibt von vorne bis hinten keinen wirklichen Sinn. Du solltest schon nachvollziehbaren Code posten und keine zusammenhanglose Schnitzel, obendrein mit include einer unbekannten Datei.

    Und zur Frage wie man den aktuellen und den nächsten Monat ermittelt:
    PHP-Code:
    Aktueller Monat: <?= date('n'?>
    <br >
    Nächster Monat: <?= date('n'strtotime('next month')) ?>
    Ausgabe:
    Code:
    Aktueller Monat: 7
    Nächster Monat: 8

    Kommentar


    • #3
      Vielen Dank!
      Das hat mir schon sehr viel weiter geholfen.

      Kommentar


      • #4
        Siehe auch: https://php-de.github.io/jumpto/datetime/

        Kommentar


        • #5
          Mir erst jetzt aufgefallen!

          Zitat von hellbringer Beitrag anzeigen
          Und zur Frage wie man den aktuellen und den nächsten Monat ermittelt:
          PHP-Code:
          Aktueller Monat: <?= date('n'?>
          <br >
          Nächster Monat: <?= date('n'strtotime('next month')) ?>
          Ausgabe:
          Code:
          Aktueller Monat: 7
          Nächster Monat: 8
          "next month" kann für diesen Fall zu falschen Ergebnissen führen.
          Wenn zum Zeitpunkt der Ausführung ein Tag vorliegt, der im nächsten Monat nicht existiert, dann wird der übernächste Monat als Ergebnis geliefert.
          z.B. am 31.08.2019 dann die 10 anstelle der 9.
          Der Bug bzw. die Fehlinterpretation von "next Month" als "+1 Month" zieht sich m.E. durch alle aktuellen PHP-Versionen durch.
          Betrifft auch DateTime() !

          Richtig:
          PHP-Code:
          date('n'strtotime('first day of next month')) 
          LG jspit

          Kommentar


          • #6
            PHP-Code:
            $date date('n'strtotime('first day of +1 month'strtotime('2019-01-31'))); 

            Kommentar


            • #7
              Zitat von jspit Beitrag anzeigen
              "next month" kann für diesen Fall zu falschen Ergebnissen führen.
              Das ist das Böse an PHP: bestimmte Statements können zu richtigen oder falschen Ergebnissen führen.

              LG

              Kommentar


              • #8
                Es gibt hier kein richtig oder falsch, sondern nur Erwartungshaltung und wie die PHP Entwickler das Problem eines nicht existierenden Datums in ihrem Parser umgesetzt haben.

                Wenn ich zum Datum 31.1.2000 einen Monat dazu addiere dann habe ich 1 + 1 = 2.
                Tage und Jahr sollen ja nicht geändert werden und bleiben als Wert erhalten.
                Als Datum erhalte ich demnach 31.02.2000.
                Dieses Datum gibt es nicht,, also was tun?

                Der Parser nimmt nun die überzähligen Tage (2000 war ein Schaltjahr und der Februar hat 29 Tage) und errechnet daraus das nächst mögliche korrekte Datum, hier also 31-29 = 2, geht in den nächsten Monat und erzeugt das Datum 2.3.2000.
                Das nennt sich dann wohl Überlauf(overlfow).

                PHP-Code:
                <?php
                $date 
                = new DateTime('31.02.2000');
                echo 
                $date->format('d.m.Y');    // ergibt 02.03.2000
                ?>
                Will man etwas anderes muss man sich das programmierenm.

                Beim letzten Tag eines jeden Monats ist es noch einfach, dann nimmt man dann das relative Format "last day of" aber bei 30.1.2000 wird es dann schon kompliziert, wie soll der nächste Monat als Datum dargestellt werden?
                29.2.2000 also immer letzter Tag, würde im darauf folgen Jahr dann 31.1.2001 machen anstatt 30.1

                Lösungsmöglichkeit wäre, das Datum bei 28 Tage so zu lassen und ab 28 Tage von hinten die Differenz zu nehmen.
                Kann aber auch zu doppelten Datumswerten führen 2 mal 27.2.2000 zum Beispiel

                Man sieht, dass es so einfach dann auch wieder nicht ist.

                Kommentar


                • #9
                  Wenn beim Addieren von einer Anzahl Monaten ein falsches Datum entsteht reagiert PHP eben wie von protestix #8 gezeigt:
                  PHP-Code:
                  echo (new DateTime("2017-01-31 14:45:16"))
                    ->
                  modify("+1 Month")
                    ->
                  format("Y-m-d H:i:s")
                  ;
                  //2017-03-03 14:45:16 
                  Die DATE_ADD() Funktion von MySQL reagiert da als Beispiel anders und schneidet die überzähligen Tage ab:
                  Code:
                  SELECT DATE_ADD('2017-01-31 14:45:16',INTERVAL 1 Month)
                  Ausgabe: 2017-02-28 14:45:16

                  Möchte man das Verhalten wie unter MySQL auch unter PHP haben, bieten einige Erweiterungsklassen von DateTime (dt, Carbon, ...) dafür schon fertige Methoden:
                  PHP-Code:
                  echo dt::create("2017-01-31 14:45:16")
                    ->
                  addMonthCut(1);
                  //2017-02-28 14:45:16 
                  Zurück zur Frage wie ermittle ich den nächsten Monat. Es geht auch ganz einfach mit dem MOD-Operator:
                  PHP-Code:
                  echo date('n')%12+1
                  Da wir hier im Einsteiger Forum sind ein Tipp wie obiges getestet wird. Das jeden Monat probieren dauert etwas zu lange .
                  Für den Test wird der 2 Parameter von date benuzt:
                  PHP-Code:
                  //Test für Sylvester 2019
                  $ts strtotime('2019-12-31');
                  echo 
                  date('n'$ts)%12+1;
                  // 1 

                  Kommentar

                  Lädt...
                  X