Auge: per mkdate() nächsten Monat ermitteln

Hallo

Ich will eine Ausgabe des folgenden Monats erreichen.
Ich gedachte dieses mit folgendem Code zu erreichen:

<?php
$mon = date("m");
$danach = strftime("%m",mktime(0, 0, 0, $mon + 1, 0, 0));
echo $danach;
?>

Nun ist ja im Moment bekanntermaßen August,
es sollte also der September, als "09" formatiert, ausgegeben werden.
Tut's aber nicht, sonst hätte ich ja auch nicht geschrieben.
Ausgabe ist "08", PHP-Fehlermeldungen kommen auch nicht.

Ist der Code falsch verschachtelt?
Unterliege ich einem Denkfehler ($mon + 1)?

etwas ratlos, Auge

  1. Hallo Auge,

    Ich will eine Ausgabe des folgenden Monats erreichen.
    Ich gedachte dieses mit folgendem Code zu erreichen:

    <?php
    $mon = date("m");
    $danach = strftime("%m",mktime(0, 0, 0, $mon + 1, 0, 0));
    echo $danach;
    ?>

    $mon + 1 addiert zum String "08" eine 1. Ich könnte mir vorstellen, daß da die automatische Typumwandlung versagt. Interessanterweise ergibt dein Skript mit einem "+2" richtig 10.
    Versuchs doch mal mit expliziter Typumwandlung.

    Gruß Susanne

    1. Hallo Susanne,

      <?php
      $mon = date("m");
      $danach = strftime("%m",mktime(0, 0, 0, $mon + 1, 0, 0));
      echo $danach;
      ?>

      $mon + 1 addiert zum String "08" eine 1. Ich könnte mir vorstellen, daß da die automatische Typumwandlung versagt. Interessanterweise ergibt dein Skript mit einem "+2" richtig 10.
      Versuchs doch mal mit expliziter Typumwandlung.

      Ich vermute, du beziehst dich auf die Anführungszeichen bei "08" und "09"?
      Die habe ich hier nur in das Posting reingesetzt, um die Ausgabe als solche zu kennzeichnen.
      Wenn ich mich nicht irre, ist die Variable $mon eine Integere Zahl.
      (scheiße formuliert, macht aba garnix)
      Da sollte 08 + 1 auch gefälligst 09 ergeben!

      Tschö, Auge

      1. Hallo Auge,

        Ich vermute, du beziehst dich auf die Anführungszeichen bei "08" und "09"?
        Die habe ich hier nur in das Posting reingesetzt, um die Ausgabe als solche zu kennzeichnen.

        Nö, ich hab den Schnipsel mal kopiert und ein "var_dump($mon);"
        eingebaut.
        Ausgabe ist
        string(2) "08"

        Noch interessanter finde ich allerdings folgendes Experiment:

        <?php
        $mon = date("m");
        var_dump($mon);
        echo "<br />";
        $danach = strftime("%m",mktime(0, 0, 0, $mon , 0, 0));
        $danachA = strftime("%m",mktime(0, 0, 0, $mon + 1, 0, 0));
        $danachB = strftime("%m",mktime(0, 0, 0, $mon + 2, 0, 0));
        echo $danach ."<br />"; // 07
        echo $danachA."<br />"; // 08
        echo $danachB."<br />"; // 09
        ?>

        wenn ich am Systemdatum spiele entsprechend.

        Erklären kann ichs nicht, aber das erinnert mich schwer an die javascript Variante Monate von 0-11 zu zählen.

        Gruß Susanne

        1. Hi,

          Nö, ich hab den Schnipsel mal kopiert und ein "var_dump($mon);"
          eingebaut.
          Ausgabe ist
          string(2) "08"

          Noch interessanter finde ich allerdings folgendes Experiment:

          <?php
          $mon = date("m");
          var_dump($mon);
          echo "<br />";
          $danach = strftime("%m",mktime(0, 0, 0, $mon , 0, 0));
          $danachA = strftime("%m",mktime(0, 0, 0, $mon + 1, 0, 0));
          $danachB = strftime("%m",mktime(0, 0, 0, $mon + 2, 0, 0));
          echo $danach ."<br />"; // 07
          echo $danachA."<br />"; // 08
          echo $danachB."<br />"; // 09
          ?>

          ist doch klar wie Kloßbrühe:

          Der 0. Tag eines Monats ist in mktime der letzte des Vormonats.
          Setz doch mal die Stelle für Tag auf 1,
          dann sollte PHP den mktime einen Zeitstempel mit dem korrekten Monat erzeugen
          (hab aber selbst auch lange gerätselt :-))

          Schönen Gruß aus Bilk

          Rainer

          1. hallo Rainer,

            ihh, der war gemein, aber jetzt wo du's sagst:

            ist doch klar wie Kloßbrühe:

            kann ich dir nicht widersprechen.

            Gruß Susanne

  2. Hallo,

    Nun ist ja im Moment bekanntermaßen August,
    es sollte also der September, als "09" formatiert, ausgegeben werden.

    Verwende diese Version:

    <?php
    $mon = date("m");
    $danach = sprintf("%02s",intval($mon)+1);
    echo $danach;
    ?>

    MfG, Thomas

    1. Hallo!

      Verwende diese Version:

      <?php
      $mon = date("m");
      $danach = sprintf("%02s",intval($mon)+1);
      echo $danach;
      ?>

      und was passiert im Dezember?

      Vermutlich sollte man das mit mktime() machen, so ähnlich wie
      http://www.dclpfaq.de/q/q-datum-gestern.html

      Grüße
      Andreas

      1. HallO!
        Ups, jetzt hate ich noch nicht alles gelesen, Problem sollte klar sein, wobei hier vielleicht auch eine "Anfängermethode" reichen solte:

        <?php
        $mon = date("m");
        if($mon==12) {echo "1";}
        else {echo ++$mon;}
        ?>

        Um Thomas Ergebnis zu bekommen würde sogar reichen:

        <?php
        $mon = date("m");
        echo ++$mon;
        ?>

        (oder lehne ich mich jetzt zu weit aus dem Fenster ;-)

        Grüße
        Andreas

      2. Hallo,

        und was passiert im Dezember?

        Dann wird eine kleine if-else-Abfrage nachgeschoben:

        <?php
        $mon = date("m");
        $mon = intval($mon);
        $mon = ($mon<12) ? $mon+=1 : 1;
        $danach = sprintf("%02s",$mon);
        echo $danach;
        ?>

        Vermutlich sollte man das mit mktime() machen, ...

        Ja klar, es gibt oft mehrere Moeglichkeiten und ich habe mktime() ja hier auch schon benutzt.

        MfG, Thomas

        1. Hallo,

          und was passiert im Dezember?

          Dann wird eine kleine if-else-Abfrage nachgeschoben:

          <?php
          $mon = date("m");
          $mon = intval($mon);
          $mon = ($mon<12) ? $mon+=1 : 1;

          sowas geht auch in PHP???

          hätte ich ja nie gedacht!

          $danach = sprintf("%02s",$mon);
          echo $danach;
          ?>

          Grüße
          Andreas

          1. Hallo,

            sowas geht auch in PHP???

            "Sowas":
            pruefbedingung ? wahr_wert : falsch_wert
            nennt sich Konditionaloperator.

            MfG, Thomas

          2. Hallo nochmal!

            Warum verwendest Du eigentlich so viele unnötige Schritte? Da kann PHP ja definitiv nichst falsch machen, da der einzige Eingabewert j aus einer PHP-Funktion stammt die garantiert eine Zahl zurückgibt!

            <?php
            $mon = date("m");
            $mon = intval($mon);

            das macht PHP doch automatisch!

            $mon = ($mon<12) ? $mon+=1 : 1;

            OK, das ist bei mir länger ;-)

            $danach = sprintf("%02s",$mon);

            Wozu das? Um es zweistelig zu haben? Oder gibt es Probleme mit der führenden Null beim rechnen? Wäre mir wenn noch nie passiert.

            echo $danach;
            ?>

            Oder sind das Gewohnheiten aus anderen Sprachen?

            Da Du ja der Datumsberechnungsguru schlechthin bist, vielleicht hast Du ja auch eine Idee warum mktime() bei mir nicht so funktioniert wie ich das gerne hätte: </?m=107339&t=19084>

            Viele Grüße
            Andreas

            1. Hallo,

              Warum verwendest Du eigentlich so viele unnötige Schritte? Da kann PHP ja definitiv nichst falsch machen, da der einzige Eingabewert j aus einer PHP-Funktion stammt die garantiert eine Zahl zurückgibt!

              Nunja, es kommt zunaechst eine Zeichenkette aus der date()-Funktion zurueck.

              <?php
              $mon = date("m");
              $mon = intval($mon);
              das macht PHP doch automatisch!

              Nunja, ich bin wohl ein ziemlicher Numeriker und wandle schon ganz gern explizit Datentypen um.

              $mon = ($mon<12) ? $mon+=1 : 1;
              OK, das ist bei mir länger ;-)

              $danach = sprintf("%02s",$mon);
              Wozu das? Um es zweistelig zu haben? Oder gibt es Probleme mit der führenden Null beim rechnen? Wäre mir wenn noch nie passiert.

              Das wollte Auge doch so. Der September sollte als "09" herauskommen.

              Da Du ja der Datumsberechnungsguru schlechthin bist, ...

              Ach noe, jetzt mal nicht -- ich verwende ja so viele unnoetige Schritte ;-).

              MfG, Thomas

              1. Hallo!

                Ach noe, jetzt mal nicht -- ich verwende ja so viele unnoetige Schritte ;-).

                Was aber unterstreicht das Du dich im Detail besser auskennst und genau weißt was da abläuft, wo unsereins sich gar keine Gedanken drum macht ;-)

                Grüße
                Andreas

                1. Hallo,

                  Ach noe, jetzt mal nicht -- ich verwende ja so viele unnoetige Schritte ;-).
                  Was aber unterstreicht das Du dich im Detail besser auskennst und genau weißt was da abläuft, wo unsereins sich gar keine Gedanken drum macht ;-)

                  Yo, sollte mensch mal drueber nachdenken ;-).

                  MfG, Thomas

                  1. Hi!

                    Yo, sollte mensch mal drueber nachdenken ;-).

                    Aber gerade deswegen verstehst Du vielleicht folgendes:

                    $sekunden = 0;
                    echo date("j",$sekunden);
                    echo date("G",$sekunden);

                    Ich will eigentlich nur wissen, weiviele Tage/Stunden seit dem "Nullpunkt 1970" vergangen sind.

                    Inzwischen ist mir klar, warum da 1  im Datum steht, es ist ja schließlich der 1.1.1970, aber doch 0:0 Uhr, oder? Warum dann auch die Uhrzeit(G) 1? Wenn ich jetzt 2000 Sekunden hätte wäre das etwas über eine Stunde. Da wird aber dann 1:2 angezeicht, also alle Werte um einen 1 verschoben, wo ist hier mein Denkfehler und wie behebe ich das?

                    Grüße
                    Andreas

                    1. Hallo,

                      Wenn ich jetzt 2000 Sekunden hätte wäre das etwas über eine Stunde.

                      Na wohl eher weniger ;-).

                      Da wird aber dann 1:2 angezeicht, also alle Werte um einen 1 verschoben, wo ist hier mein Denkfehler und wie behebe ich das?

                      <?php

                      $sekunden=2000;
                      $ausgabe=date("H:i:s",mktime(0,0,$sekunden));
                      print $ausgabe; // --> 00:33:20

                      ?>

                      Tage, Monate, Jahre kanst Du analog herausholen.

                      MfG, Thomas

                      1. Hallo!

                        Wenn ich jetzt 2000 Sekunden hätte wäre das etwas über eine Stunde.

                        Na wohl eher weniger ;-).

                        ups ;-)

                        Da wird aber dann 1:2 angezeicht, also alle Werte um einen 1 verschoben, wo ist hier mein Denkfehler und wie behebe ich das?

                        <?php

                        $sekunden=2000;
                        $ausgabe=date("H:i:s",mktime(0,0,$sekunden));
                        print $ausgabe; // --> 00:33:20

                        ?>

                        Ich glaube ich habe das eigentliche Problem erkannt: 1 Std. Unterschied zu GMT!!! Denn wenn ich Sekunde = 0 eingebe bekomme ich

                        01:00:00

                        Also habe ich statt date gmdate verwendet und jetzt ist die Stunde richtig, den Tage habe ich "nachträglich" um 1 reduziert, was nur leider am Monatsende problematisch werden sollte.

                        Aber erstmal gehts, danke Dir!

                        Grüße
                        Andreas