Simone: kleines Datumsproblem

Hallo,

Ich habe den 31.01.2005 und möchte einen Monat dazu addieren

also der 28.02.2005

Mein Versuch:

echo date('d.m.Y',mktime(0,0,0,1,31,2005)).'<br>';
// 31.01.2005

echo date('d.m.Y',mktime(0,0,0,1+1,31,2005)).'<br>';
// 03.03.2005 ist fehlerhaft

Bin auf der Suche nach einer Funktion wie z. B.

31.01.2005 + 1 Monat

Wie kann ich das am besten lösen?

Danke Simone

  1. Hi,

    Ich habe den 31.01.2005 und möchte einen Monat dazu addieren
    also der 28.02.2005

    "also"? Du scheinst darin irgend eine Logik zu sehen, die mir allerdings verschlossen bleibt. Erkläre also bitte diese Logik.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
    1. Hi,

      echo date('d.m.Y',mktime(0,0,0,1,28,2005)).'<br>'; // 28.01.2005
      echo date('d.m.Y',mktime(0,0,0,1+1,28,2005)).'<br>';// = 28.02.2005

      mktime addiert jeweils einen Monat zum Ausgansdatum
      es sei den es ist der 31 und der Folgemoat hat kein 31 Tage.

      Also muss es doch eine php Funktion geben die erkennen kann das es im Folgemonat nur ein 28 Tage sind.

      ala 31.1 ein monat dazu nicht 31.2 sondern 28.2

      Simone

      1. Hallo,

        Also muss es doch eine php Funktion geben die erkennen kann das es im Folgemonat nur ein 28 Tage sind.

        da hilft ein kleines Array (und evtl. eine Schaltjahr-Bestimmung).

        ala 31.1 ein monat dazu nicht 31.2 sondern 28.2

        Aha. Und was wäre nach deiner Ansicht der 10.01. + 1 Monat? Etwa der 07.02.?

        Ciao,
         Martin

        --
        Wichtig ist, was hinten rauskommt.
          (Helmut Kohl, 16 Jahre deutsche Bundesbirne)
      2. Hi,

        echo date('d.m.Y',mktime(0,0,0,1+1,28,2005)).'<br>';// = 28.02.2005
        mktime addiert jeweils einen Monat zum Ausgansdatum

        nein, das macht die Addition.

        es sei den es ist der 31 und der Folgemoat hat kein 31 Tage.

        Bist Du sicher, dass das eine günstige Formulierung für die Gesamtheit aller Ausnahmen ist?

        Also muss es doch eine php Funktion geben die erkennen kann das es im Folgemonat nur ein 28 Tage sind.

        Es gibt PHP-Funktionen, die sich über die Zahl der Tage eines Monats im Klaren sind - Du badest gerade Deine Hände darin. Die Frage ist, was damit *passieren* soll, und das kann PHP nicht wissen. Es ist _Deine_ Aufgabe, einen Algorithmus zu definieren, der mit einem endlichen Set an Regeln aus _jedem_ Ausgangswert den Dir genehmen Endwert produziert. Dann und _erst_ dann ist es möglich, diesen Algorithmus unter Verwendung von PHP-Funktionen zu implementieren.

        ala 31.1 ein monat dazu nicht 31.2 sondern 28.2

        Genau wie Martin habe ich den Eindruck, dass Du nur Einzelfälle betrachtest. Es ist Dein Job, *jeden* Fall zu betrachten. So wie Du vorgehst, könntest Du auch leicht beweisen, dass jede ungerade Zahl größer 2 eine Primzahl ist:

        3 ist prim, 5 ist prim, 7 ist prim, weiter mit vollständiger Induktion.

        Cheatah

        --
        X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
        X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
        X-Will-Answer-Email: No
        X-Please-Search-Archive-First: Absolutely Yes
  2. Hallo Simone,

    Ich habe den 31.01.2005 und möchte einen Monat dazu addieren

    dabei dürfte das Hauptproblem sein, dass der Zeitbegriff "Monat" nicht klar definiert ist: Ein Monat kann ein Zeitraum von 28 bis 31 Tagen sein. Du musst dir also erstmal überlegen, welchen Zeitraum du jeweils meinst.

    echo date('d.m.Y',mktime(0,0,0,1+1,31,2005)).'<br>';
    // 03.03.2005 ist fehlerhaft

    Wie man's nimmt. Du willst den 31.02.2005 - den gibt's aber nicht, weil der Februar nur 28 Tage hat, also normalisiert PHP das Datum. Normalerweise ist das eine tolle Eigenschaft, die man ausnutzen kann. Hier ausnahmsweise nicht.

    31.01.2005 + 1 Monat
    Wie kann ich das am besten lösen?

    Finde heraus, wieviele Tage der Monat des Ausgangsdatums hat, und addiere genau so viele Tage zum Startdatum.

    So long,
     Martin

    --
    Wissen erwirbt man, indem man immer das Kleingedruckte sorgfältig liest.
    Erfahrung bekommt man, indem man das nicht tut.
    1. Hi,  Martin

      Danke Dir habe jetzt eine kleine Funktion geschrieben.

      $ausgangsmonat=1;
      $endmonat = 2;

      $days = debug_mktime($ausgangsmonat,$endmonat);
      echo date('d.m.Y',mktime(0,0,0,1,(31+$days),2005)).'<br>'; // 31.01.2005
      function debug_mktime($monat_anf, $monat_end)
      {
      for($i=$monat_anf+1;$i<=$monat_end;$i++)
      {
      switch($i)
      {
      case 1: case 3: case 5: case 7: case 8: case 10: case 12: $tage = 31; break;
      case 4: case 6: case 9: case 11: $tage = 30; break;
      case 2: $tage = 28;break;
      }
      echo "monat $i : $tage <br>";

      $days +=$tage;

      }
      echo "$days gesamt<br>";
      return $days;
      }

      Ich finde das jedoch nicht optimal es muss doch
      noch was besseres geben?

      Simone

      1. Hi,

        Ich finde das jedoch nicht optimal es muss doch
        noch was besseres geben?

        so ist es... Du musst Dir nur über die Aufgabenstellung klar werden und wissen, dass PHP eine Besonderheit parat hält, nämlich den 0.Tag des Folgemonats als Äquivalent des letzten Tages des Monats. Im Code kann das dann so aussehen:

        $m = 1; $d = 31; $y = 2005;  
        $n = mktime(0,0,0,$m+1,$d,$y);  
        if(getdate($n) != $m+1) $n = mktime(0,0,0,$m+2,0,$y);  
        echo date('d.m.Y',$n);
        

        freundliche Grüße
        Ingo

        1. Hi,
          Ingo

          Ich habe es nochmal verändert getdate($n) ist ein Array

          $dazu_monate= 12;
          $m = 1; $d = 31; $y = 2005;
          $n = mktime(0,0,0,$m+$dazu_monate,$d,$y);
          $array_date = getdate($n);
          if($array_date['mon'] != $m+$dazu_monate)
          {
           $n = mktime(0,0,0,$m+$dazu_monate+1,0,$y);
          }
          else
          {
           $n = mktime(0,0,0,$m+$dazu_monate,$d,$y);
          }
           echo '<br>'.date('d.m.Y',$n);

          Danke Dir Du bist ein Schatz!

      2. Hi,

        case 1: case 3: case 5: case 7: case 8: case 10: case 12: $tage = 31; break;
        case 4: case 6: case 9: case 11: $tage = 30; break;
        case 2: $tage = 28;break;

        Letzteres ist unglücklich gewählt. Schaltjahre existieren.

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        Schreinerei Waechter
        O o ostern ...
        Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.
  3. Hey,

    Ich habe den 31.01.2005 und möchte einen Monat dazu addieren
    also der 28.02.2005

    mache nie Zeit- und Datumsgeschichten selber.

    1. Es ist ein gelöstes Problem, wenn du dir selber erneut die Mühe machst, bist du nicht tugendhaft-faul genug.
    2. Du hast nicht genug Ahnung, um es richtig zu machen. Nur wenige Leute sind dafür schlau genug, und selbst die hauen subtile Bugs rein und es dauert einige Zeit, bis der Code stabil und fehlerfrei ist.

    Daher: http://pear.php.net/package/Date
    Rufe die Funktion nextDay 28mal auf. Wenn dir das auch mächtig bescheuert vorkommt, geht's dir wie mir.

    --
    水-金-地-火-木-土-天-海-冥
    1. hi,

      Daher: http://pear.php.net/package/Date
      Rufe die Funktion nextDay 28mal auf. Wenn dir das auch mächtig bescheuert vorkommt, geht's dir wie mir.

      Warum schlägst du's dann vor?

      Zumal damit immer noch das Problem (bzw. die Aufgabe) für die Fragerin höchstvermutlich ungelöst im Raum steht, wie sie herausbekommt, dass in diesem Falle die Funktion genau 28 Mal aufzurufen wäre.

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
  4. Hi Simone,

    ich kenne mich leider in PHP nicht aus. Aber ich nehme an, dass es in PHP genauso Datumsfunktionen geben muss (wie eigentlich in jeder Hochsprache).

    Losgelöst von PHP würde ich das Problem folgendermaßen lösen:
    Ich hole mir vom Ausgangsdatum den ersten des Monats (1.1.). Zu diesem Datum addiere ich zwei Monate hinzu (1.3.) und ziehe hiervon einen Tag ab, dann erhalte ich den 28.2. bzw den 29.2.

    Ich habe dir den Code stellvertretend für PHP in SQL und VB.NET aufgeschrieben. Vielleicht kannst du dieses Muster ja in PHP nachbauen

    T-SQL:
    -- temporäre Variablen
    DECLARE @LAST_OF_MONTH datetime
    DECLARE @FIRST_OF_MONTH datetime
    DECLARE @TWO_MONTHS_ADDED datetime
    DECLARE @TARGET_DATE datetime

    select @LAST_OF_MONTH = '20050131' -- Startdatum

    -- ersten des Monats berechnen
    select @FIRST_OF_MONTH = DATEADD(day, (- DATEPART(DAY,@LAST_OF_MONTH) +1), @LAST_OF_MONTH)
    -- zwei Monate addieren
    select @TWO_MONTHS_ADDED = DATEADD(month, 2, @FIRST_OF_MONTH)
    -- einen Tag abziehen und voilà...
    select @TARGET_DATE = DATEADD(day, -1, @TWO_MONTHS_ADDED)

    VB.Net:
    Dim GivenDate As New Date(2005, 1, 31)
    Dim SearchedDate As Date = GivenDate.AddDays(1 - GivenDate.Day).AddMonths(2).AddDays(-1)

    Dieses Muster ist völlig losgelöst von jedem Schaltjahr, da die Datumsfunktionen für dich den Rest erledigen.

    Hoffe ich konnte dir weiterhelfen
    Grüße aus dem wilden Süden
    Noodles