Benutzer mit den meisten Antworten
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.
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.
-
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
- Bearbeitet Stefan FalzModerator Donnerstag, 1. August 2013 17:09 Grund
-
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.
-
-
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.
-