Maxi: Differenz zwischen zwei Date-Objekten berechnen in Monaten

Hallo,

ich habe zwei Date-Objekte und möchte berechnen, wie groß deren Differenz in Monaten ist. Ausgangstag ist immer der 1. eines Monats, also z.B. 01.01.2011 und 01.03.2011. Die Differenz ist dann 2 Monate (Januar und Februar).

Kann ich das irgendwie direkt über die Date-Objekte berechnen? Oder muss ich mir Monat und Jahr holen und dann umständlich mit if-Abfragen rechnen?

Danke und Grüße, Maxi

  1. Liebe(r) Maxi,

    Du erzeugst einfach ein neues Date-Objekt, welches Du mit der Anzahl Millisekunden aus der Differenz der beiden vorhandenen Date-Objekte initialisierst. Dann kannst Du (beginnend mit dem 01.01.1970) die Anzahl Monate errechnen.

    Folgender Code ist ungetestet:

    function monate(alt, neu) {  
        var d = new Date(neu.getTime() - alt.getTime());  
        return d.getMonth() + 12 * (d.getFullYear() - 1970);  
    }
    

    Liebe Grüße,

    Felix Riesterer.

    --
    ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
    1. Lieder Felix,

      danke für die schnelle Antwort.

      Leider funktioniert das nicht.

      Folgender Code ist ungetestet:

      function monate(alt, neu) {

      var d = new Date(neu.getTime() - alt.getTime());
          return d.getMonth() + 12 * (d.getFullYear() - 1970);
      }

      
      >   
        
      Beim Aufruf von  
        
      alt = new Date(1, 1,2010);  
      neu = new Date(1, 1, 2011);  
        
      alert(monate(alt, neu));  
        
      ergibt die Differenz 0, der 01.01.2011 und der 01.11.2010 ergibt -9.  
        
      Nichts desto trotz, danke!  
        
      Hat vielleicht noch jmd. anders eine gute Idee?  
        
      Danke und Grüße, DIE Maxi ;)
      
      1. Liebe Maxi,

        Leider funktioniert das nicht.

        "funktioniert nicht" funktioniert nicht.

        alt = new Date(1, 1,2010);
        neu = new Date(1, 1, 2011);

        Vergleiche: http://de.selfhtml.org/javascript/objekte/date.htm#allgemeines

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. Lieber Felix,

          Vergleiche: http://de.selfhtml.org/javascript/objekte/date.htm#allgemeines

          oh oh, das ist mir aber peinlich. ;) So funktioniert es dann doch - aber die Version die mir weiter oben gepostet wurde gefällt mir ein Stück besser, da einfacher (bzw. kürzer).

          Nichts desto trotz, vielen Dank für die super schnelle Hilfe!

          Viele Grüße und ein schönes Wochenende,

          Maxi

      2. Hallo,

        Lieder Felix

        ob er auch singt, weiß ich nicht ... ;-)

        Leider funktioniert das nicht.

        Liegt der Fehler nicht vielleicht bei dir?

        alt = new Date(1, 1, 2010);
        neu = new Date(1, 1, 2011);

        Diese beiden nicht normalisierten Datumsangaben unterscheiden sich genau um einen Tag, es handelt sich um den 2010. Februar des Jahres 1 und den 2011. Februar des Jahres 1. Javascript normalisiert das intern automatisch auf den 03. und 04. August 1906. Warum 1906?? Anscheinend beginnt die Javascript-Zählung mit dem 01.01.1900 und nicht erst mit 1970, wie in SELFHTML nachzulesen ist.
        Beachte die Reihenfolge der Parameter beim Konstruktorausfruf des Date-Objekts, und beachte ferner, dass die Monate hier von 0..11 zählen.

        Ciao,
         Martin

        --
        Lache, und die Welt wird mit dir lachen.
        Schnarche, und du schläfst allein.
        Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
        1. Lieber Martin (bei dir gehe ich mal nicht davon aus, dass du singen kannst ;)),

          Lieder Felix

          ob er auch singt, weiß ich nicht ... ;-)

          davon bin ich einfach mal ausgegangen :D

          Beachte die Reihenfolge der Parameter beim Konstruktorausfruf des Date-Objekts, und beachte ferner, dass die Monate hier von 0..11 zählen.

          Das ist peinlich. Da bin ich wohl zu geschädigt von anderen Sprachen. Danke für den Hinweis!

          Viele Grüße und ein schönes Wochenende,

          Maxi

  2. Hi,

    ich habe zwei Date-Objekte und möchte berechnen, wie groß deren Differenz in Monaten ist. Ausgangstag ist immer der 1. eines Monats, also z.B. 01.01.2011 und 01.03.2011. Die Differenz ist dann 2 Monate (Januar und Februar).

    Kann ich das irgendwie direkt über die Date-Objekte berechnen?

    Eher schlecht - weil das nicht deiner Definition von Monaten folgt.

    Oder muss ich mir Monat und Jahr holen und dann umständlich mit if-Abfragen rechnen?

    Wieso umständlich, das ist doch ziemlich simpel.

    • Differenz der Jahreszahlen bilden, und wenn Startmonat > Endmonat ist, eins davon abziehen
    • mit zwölf multiplizieren
    • Differenz von Startmonat minus Endmonat bilden, 12 draufaddieren, Modulo 12 nehmen, und das dann noch auf die vorher ermittelte Zahl draufaddieren

    MfG ChrisB

    --
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    1. Hallo,

      Wieso umständlich, das ist doch ziemlich simpel.

      ja, eigentlich schon.

      • Differenz der Jahreszahlen bilden, und wenn Startmonat > Endmonat ist, eins davon abziehen
      • mit zwölf multiplizieren
      • Differenz von Startmonat minus Endmonat bilden, 12 draufaddieren, Modulo 12 nehmen, und das dann noch auf die vorher ermittelte Zahl draufaddieren

      Wieso umständlich mit Fallunterscheidungen?
        (Jahr1*12 + Monat1) - (Jahr2*12 + Monat2)

      Damit ist sogar egal, ob man den Monat von 0..11 oder von 1..12 zählt.
      Kleiner Schönheitsfehler: Damit liegen der 31.03.2011 und der 01.04.2011 einen Monat auseinander. Ob das in diesem speziellen Fall so gewünscht ist, geht aber aus der ursprünglichen Aufgabenstellung nicht hervor.

      Ciao,
       Martin

      --
      F: Wer ist der Herrscher über Wasser, Wind und Wellen?
      A: Der Friseur.
      Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
      1. Hi,

        Kleiner Schönheitsfehler: Damit liegen der 31.03.2011 und der 01.04.2011 einen Monat auseinander. Ob das in diesem speziellen Fall so gewünscht ist, geht aber aus der ursprünglichen Aufgabenstellung nicht hervor.

        Eigentlich geht das schon deutlich hervor: "Ausgangstag ist immer der 1. eines Monats,"

        cu,
        Andreas

        --
        Warum nennt sich Andreas hier MudGuard?
        O o ostern ...
        Fachfragen per Mail sind frech, werden ignoriert. Das Forum existiert.
      2. Lieber Martin,

        Wieso umständlich mit Fallunterscheidungen?
          (Jahr1*12 + Monat1) - (Jahr2*12 + Monat2)

        wow, das ist ja super kurz, danke!

        Kleiner Schönheitsfehler: Damit liegen der 31.03.2011 und der 01.04.2011 einen Monat auseinander. Ob das in diesem speziellen Fall so gewünscht ist, geht aber aus der ursprünglichen Aufgabenstellung nicht hervor.

        Wie bereits ein Antwortender geschrieben hat schreibe ich ja immer, dass es am 01. eines Monats beginnt, von daher ist das so perfekt.

        Vielen Dank, viele Grüße und ein schönes Wochenende,

        Maxi