strtotime fehlerhaft?

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

  • strtotime fehlerhaft?

    Hi.

    Ich habe ein Formular, wo sich der User eine Start- und Endzeit auswählt. In diesem Zeitfenster führe ich dann verschiedene Berechnungen etc. aus, was auch gut funktioniert.

    Jedoch spuckt er für folgendes Beispiel nicht Ende April, sondern Anfang Mai aus. Woran liegt das? Problem ist auch bei sämtlichen anderen Monatswerten am Ende.

    PHP-Code:
    $beispielDate "2010-03-31";
    echo 
    date("Y-m-d"strtotime("$beispielDate +1 months")); 
    mfg streuner


    Danke. Mfg streuner
    Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
    der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

    "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

  • #2
    Weil der April nur 30 Tage hat, month aber offenbar von 31 ausgeht.

    Peter
    Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
    Meine Seite

    Kommentar


    • #3
      Hi.

      Ok, bin davon ausgegangen, dass +1 months ein allg. Befehl ist (unabhängig von der Tagesanzahl je Monat), der so etwas beachtet.

      Dann muss ich das anders machen. Thanx.

      mfg streuner
      Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
      der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

      "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

      Kommentar


      • #4
        Eigentlich bin ich auch von dem verhalten ausgegangen …*mal forschen.

        Edit: Früher war mal ein Link in der Doku, dass die Syntax der von GNU date entspricht. Kurz gegooglet und das gefunden.
        Zuletzt geändert von unset; 25.02.2010, 12:15.
        [FONT="Helvetica"]twitter.com/unset[/FONT]

        Shitstorm Podcast – Wöchentliches Auskotzen

        Kommentar


        • #5
          PHP-Code:
          echo date("Y-m-d"strtotime("2010-01-30 +1 month"));
          // 2010-03-02

          echo date("Y-m-d"strtotime("2010-02-31 +1 month"));
          // 2010-04-03 

          Kommentar


          • #6
            Zitat von Kropff Beitrag anzeigen
            Weil der April nur 30 Tage hat, month aber offenbar von 31 ausgeht.

            Peter
            Genau. Da ein Monat von 28 bis 31 tagen lang sein kann, versucht die funktion ein Monat als anzahl von den Tagen in $beispielDate -Monat auszugehen.
            Das sieht man besonders wenn mann mit "2010-01-31 +1 months" und dann mit "2009-11-30 +3 months"
            versucht.


            Ich will nicht behaupten, dass so ein Verhalten für jeden richtig ist, aber was willst du machen, wenn der Monat eben keine genaue Einheit ist.

            würde man bei "2010-03-31 +1 months" ein 2010-04-30 bekommen, dann hätten bestimmt die Leute frage gestellt:
            Warum (2010-03-31 +1 months) und (2010-03-30 +1 months) gleichen Ergebnis liefern
            Slava
            bituniverse.com

            Kommentar


            • #7
              Danke für die Antworten.

              Stimmt eine konkrete Lösung "kann" es ja auch nicht geben in dem Fall.
              Wenn man z.B. die Differenz des Datums zum Ende des eingegebenen Monats nimmt und als Basis für +1 months nimmt, kommt das ja auch nicht hin! Grübel...!

              Werde das Problem jetzt anders lösen. Thanx nochmal.

              mfg streuner
              Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
              der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

              "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

              Kommentar


              • #8
                Zitat von Kropff Beitrag anzeigen
                Weil der April nur 30 Tage hat, month aber offenbar von 31 ausgeht.

                Peter
                Dann würde aber auch

                PHP-Code:
                <?php echo strftime("%Y-%m-%d"strtotime("2000-02-01 +1 month")); ?>
                Den 2000-03-03 ausgeben und nicht 2000-03-01 ...

                Das Problem ist wohl eher die "Landing Zone" ...
                carpe noctem

                [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
                [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

                Kommentar


                • #9
                  Was meinst Du mit "landing zone"?

                  mfg streuner
                  Erst wenn der letzte FTP Server kostenpflichtig, der letzte GNU-Sourcecode verkauft, der letzte Algorithmus patentiert,
                  der letzte Netzknoten verkommerzialisert ist, werdet Ihr merken, dass Geld nicht von alleine programmiert.

                  "Diese Software verdient die 3 großen GGG: --- Gesehen --- Gelacht --- Gelöscht ---"

                  Kommentar


                  • #10
                    Zitat von streuner Beitrag anzeigen
                    Was meinst Du mit "landing zone"?

                    mfg streuner
                    Na ... das Problem tritt nur auf, wenn ich ein Datum um einen Monat inkrementiere, dessen Tag ausserhalb des Gültigkeitsbereichs des Zielmonats ist.

                    "Landing Zone" der Punkt wo das Ergebnis landet ...
                    carpe noctem

                    [color=blue]Bitte keine Fragen per EMail ... im Forum haben alle was davon ... und ich beantworte EMail-Fragen von Foren-Mitgliedern in der Regel eh nicht![/color]
                    [color=red]Hinweis: Ich bin weder Mitglied noch Angestellter von ebiz-consult! Alles was ich hier von mir gebe tue ich in eigener Verantwortung![/color]

                    Kommentar


                    • #11
                      Das "Problem" ist halt das strtotime() zuerst mal den absoluten Teil des Datums verarbeitet, bevor es an die relativen Anweisungen kommt. D.h. ein "ungültiges" Datum wird zuerst in ein gültiges umgewandelt und dann der Monat drauf addiert.

                      Am Beispiel:

                      Eingabe: "31.02.2010 +1 month"
                      1. Schritt: "31.02.2010" > Wird zu "03.03.2010" (da der Feb. 2010 nur 28 Tage hat)
                      2. Schritt: "+1 month" > Erzeugt dann, ausgehend vom 1. Schritt, den "03.04.2010"


                      Die Funktion strtotime() ist schon in Ordnung wie es ist, man muss nur wissen das es eben so funktioniert.

                      Kommentar


                      • #12
                        Zitat von DSitC Beitrag anzeigen
                        D.h. ein "ungültiges" Datum wird zuerst in ein gültiges umgewandelt und dann der Monat drauf addiert.
                        In dem Beispiel oben, ist es genau umgekehrt: Es wird ein Monat aufaddiert und dann das Datum korrigiert.
                        [FONT="Helvetica"]twitter.com/unset[/FONT]

                        Shitstorm Podcast – Wöchentliches Auskotzen

                        Kommentar


                        • #13
                          Narf, stimmt! Mea culpa...

                          Kommentar


                          • #14
                            Bin mir nicht sicher aber probiers mal mit
                            [COLOR=#000000][COLOR=#006600]echo [/COLOR][COLOR=#0000cc]date[/COLOR][COLOR=#006600]([/COLOR][COLOR=#cc0000]"Y-m-d"[/COLOR][COLOR=#006600], [/COLOR][COLOR=#0000cc]strtotime[/COLOR][COLOR=#006600]([/COLOR][COLOR=#cc0000]"$beispielDate +1 months, -1day"[/COLOR][COLOR=#006600]));


                            [/COLOR][/COLOR]

                            Kommentar


                            • #15
                              Zitat von wono Beitrag anzeigen
                              Bin mir nicht sicher aber probiers mal mit
                              [COLOR=#000000][COLOR=#006600]echo [/COLOR][COLOR=#0000cc]date[/COLOR][COLOR=#006600]([/COLOR][COLOR=#cc0000]"Y-m-d"[/COLOR][COLOR=#006600], [/COLOR][COLOR=#0000cc]strtotime[/COLOR][COLOR=#006600]([/COLOR][COLOR=#cc0000]"$beispielDate +1 months, -1day"[/COLOR][COLOR=#006600]));


                              [/COLOR][/COLOR]
                              Wie wäre es, wenn du es selber ausprobierst, bevor du anderen _irgendwas_ empfiehlst?

                              Kommentar

                              Lädt...
                              X