none
TypeScript ( Javascript) Probleme mit der Berechnung der getMonth()

    Frage

  • Hallo,

    habe folgende function geschrieben:

    function changeDate(op: string, date: Date, quantity: number, unit: number ) {

    var factor = op == "+" ? 1 : -1;

    Switch (unit)

    case 928400000:

    date.setDate(date.getDate().... und so weiter

    case 928400001:

    date.setDate .... mit week etc.

    // hier wichtig

    case 928400002:

    date.setMonth(date.getMonth() + quantity * factor);

    break;

    Default:

    throw....

    }

    return date;

    Die ersten case habe ich nicht weiter ausführlich geschrieben da sie funktionieren. Mein Problem ist mit Month. Da ist das Problem bei Monaten mit 31 Tagen. Wenn ich Monate abziehe bekommen ich in CRM im plus 1 Tag dazu gegeben. Bei Monaten mit 30 Tagen bzw. wenn zum 15 eines Monate abgezogen wird ist alles ok. Nur mit Monaten mit 31 Tage. Hier folgende Bsp:

    Op = "-" , Datum 31.12.2013, quantity = 2,  unit = 928400002 ( crm wert für Monat in eine Pickliste)

    Als Ergebnis bekomme ich anstatt 31.10.2013 den 1.11.2013 ( er sollte eigentlich 2 Monate abziehen)

    in meine Unit Tests ist aber die Berechnung korrekt :-(

    Ich hoffe konnte mich einigermaßen deutlich ausdrücken. Danke für die Antworten

    lg

    Arash


    Vielen Dank. Man braucht den Rat anderer nicht zu befolgen, damit sie sich gut fühlen. Es genügt, sie um Rat zu fragen.

    Donnerstag, 1. August 2013 16:57

Antworten

    • Inzwischen habe ich eine Lösung gefunden und wollte es hier aufzeigen. Aufbauend auf Stefans Beitrag habe ich im Prinzip mir einen Dummy Datum erstellt und die Monate miteinander verglichen. Hierbei habe ich bei habe ich einen DammyDate erstellt und die mit tatsächliche Datum die Monate vergleichen. So kann ich sehen ob bei der Berechnung auch der Monat stimmt. ( sicherlich gibt es auch elegantere Wege) aber jetzt macht das auch was er machen soll.

       

      case 928400002:

                  var days: number = date.getDate();
                  if (days >= 29) {
                      var dummyDate: Date = new Date(date.getFullYear(), date.getMonth(), date.getDate() - 3);
                      date.setMonth(date.getMonth() + quantity * factor);
                      dummyDate.setMonth(dummyDate.getMonth() + quantity * factor);
                      if (date.getMonth() != dummyDate.getMonth()) {
                          date.setDate(date.getDate() + date.getDate() * (-1))
                      }
                  }


    Vielen Dank. Man braucht den Rat anderer nicht zu befolgen, damit sie sich gut fühlen. Es genügt, sie um Rat zu fragen.

    • Als Antwort vorgeschlagen Tim103 Montag, 5. August 2013 11:03
    • Als Antwort markiert Arash_FFM Montag, 5. August 2013 11:04
    Montag, 5. August 2013 11:01

Alle Antworten

  • Hi,

    das Problem ist zum einen, dass getMonth und setMonth nullbasiert arbeiten. getMonth für 2013-01-31 würde 0 liefern, 2013-02-15 dann 1, ...

    Zum anderen ist die Methode IMHO nicht wirklich verwendbar, da sie beim überschreiten der maximalen Tage eines Monats stillschweigend in den nächsten Monat gehen.

    Siehe dazu auch:

      http://stackoverflow.com/questions/14680396/the-date-getmonth-method-has-bug

    Dort findest Du eine recht gute Erklärung dazu.

    Dazu kommt noch, dass setMonth IMHO doch recht merkwürdig arbeitet. Siehe:

      http://www.w3schools.com/jsref/jsref_setmonth.asp


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community


    Donnerstag, 1. August 2013 17:06
  • Hallo Stefan,

    danke für die schnelle Antwort. Jetzt weiß ich woran das liegt. Ich versuche eine Lösung zu finden wie ich das abfangen kann und wenn ich eine habe werde ich es hier reinschreiben. Falls Jemand auch noch eine Idee hat bin ich dankbar für einen Tip. 


    Vielen Dank. Man braucht den Rat anderer nicht zu befolgen, damit sie sich gut fühlen. Es genügt, sie um Rat zu fragen.

    Freitag, 2. August 2013 09:11
    • Inzwischen habe ich eine Lösung gefunden und wollte es hier aufzeigen. Aufbauend auf Stefans Beitrag habe ich im Prinzip mir einen Dummy Datum erstellt und die Monate miteinander verglichen. Hierbei habe ich bei habe ich einen DammyDate erstellt und die mit tatsächliche Datum die Monate vergleichen. So kann ich sehen ob bei der Berechnung auch der Monat stimmt. ( sicherlich gibt es auch elegantere Wege) aber jetzt macht das auch was er machen soll.

       

      case 928400002:

                  var days: number = date.getDate();
                  if (days >= 29) {
                      var dummyDate: Date = new Date(date.getFullYear(), date.getMonth(), date.getDate() - 3);
                      date.setMonth(date.getMonth() + quantity * factor);
                      dummyDate.setMonth(dummyDate.getMonth() + quantity * factor);
                      if (date.getMonth() != dummyDate.getMonth()) {
                          date.setDate(date.getDate() + date.getDate() * (-1))
                      }
                  }


    Vielen Dank. Man braucht den Rat anderer nicht zu befolgen, damit sie sich gut fühlen. Es genügt, sie um Rat zu fragen.

    • Als Antwort vorgeschlagen Tim103 Montag, 5. August 2013 11:03
    • Als Antwort markiert Arash_FFM Montag, 5. August 2013 11:04
    Montag, 5. August 2013 11:01