Staticskill Geschrieben 1. Dezember 2010 Teilen Geschrieben 1. Dezember 2010 Hallo zusammen, ich habe aktuell folgendes Problem: Ausgehend von einem Datum muss ich Tage zum Datum dazuaddieren was mit DateTime.AddDays() ja kein Problem ist. Das Problem ist jetzt nur, dass die Anforderung besteht, das neue Datum ausgehend von 360 Tagen pro Jahr zu ermitteln. D.h. 01.01. + 30 Tage = 01.02. 15.01. + 15 Tage = 01.02. Ich hab schon alles mögliche ausprobiert, vom hochzählen der Tage in einer Schleife und anschließend die Differenz zum Monatsende abziehen, bis hin zu einem virtuellen Datum, dass den 30.02. beinhaltet usw. Ich bin anscheinend wirklich einfach zu dumm, das Problem zu lösen, darum bitte ich hier um Hilfe. Ich hoffe es kann mir jemand helfen. Sämtliches was ich über google gefunden habe, bezieht sich nur auf den Tagesunterschied zwischen 2 Terminen, nicht jedoch, wenn man nur Tage dazuaddieren will. Vielen Dank schonmal im Voraus für eure Hilfe Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 1. Dezember 2010 Teilen Geschrieben 1. Dezember 2010 Das Problem ist jetzt nur, dass die Anforderung besteht, das neue Datum ausgehend von 360 Tagen pro Jahr zu ermitteln. D.h. 01.01. + 30 Tage = 01.02. 15.01. + 15 Tage = 01.02.Die Anforderung ist meiner Meinung nach nicht ausreichend spezifiziert. Sollen nur Vielfache von 15 Tagen addiert werden, oder beliebige Werte? Soll nur auf Montagsanfang/-mitte addiert werden, oder auf beliebige Daten? Was soll 31.01. + 30 Tage ergeben? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Staticskill Geschrieben 1. Dezember 2010 Autor Teilen Geschrieben 1. Dezember 2010 (bearbeitet) Die Anforderung ist meiner Meinung nach nicht ausreichend spezifiziert. Sollen nur Vielfache von 15 Tagen addiert werden, oder beliebige Werte? Soll nur auf Montagsanfang/-mitte addiert werden, oder auf beliebige Daten? Was soll 31.01. + 30 Tage ergeben? beliebige Werte auf beliebige Daten Beispiel: 05.06.07 + 123 Tage Was soll 31.01. + 30 Tage ergeben? Beispiele: 31.01. + 30 = 28.02. 31.03. + 30 = 30.04. 30.03. + 30 = 30.04. Bearbeitet 1. Dezember 2010 von Staticskill Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 1. Dezember 2010 Teilen Geschrieben 1. Dezember 2010 (bearbeitet) Wie kommt man denn auf 360 Tage? Die restlichen Tage müssen ja dann irgendwo fehlen wodurch du ja quasi mit einem eigenen Kalender arbeitest. Da wirst du mit DateTime nicht weit kommen weil das mit dem gregorianischen Kalender arbeitet und da ist nunmal der 1.1 + 30 Tage der 31.1 31.03. + 30 = 30.04. 30.03. + 30 = 30.04. Ist das ein Tippfehler oder ergibt das nur für mich keinen Sinn? Bearbeitet 1. Dezember 2010 von Guybrush Threepwood Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 1. Dezember 2010 Teilen Geschrieben 1. Dezember 2010 Es soll eine beliebige Anzahl an Tagen dazuaddiert werden, also {1-~} 01.02. + 30 = 01.03. 01.02. + 29 = 01.03. 01.02. + 28 = 01.03. 01.02. + 27 = 28.02. 01.01. + 30 = 01.02. 01.01. + 29 = 30.01. Soweit richtig? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Staticskill Geschrieben 1. Dezember 2010 Autor Teilen Geschrieben 1. Dezember 2010 @guybrush Das Problem mit den 360Tagen resultiert daraus, dass der Kunde quasi einen Preis / Monat bekommt (also für 30 Tage). Da es aber sein kann, dass ein Vertrag mit dem Kunden am xx.ten des Monats gekündigt wird, oder einfach nur ein paar Tage läuft, ist es nunmal die Anforderung an das Programm, das richtig umzusetzen. @Klotzkopp Soweit richtig, aber: 28.02. +30 Tage = 30.03. Eigentlich muss ich auch nur einen Korrekturtag abziehen, da der erste Tag quasi mit zählt, aber ich denke das sollte dann am Ende kein Problem mehr sein. Letzendlich solls so ausehen: (natürlich mit oben erwähnten Regeln) Datum || Monat || Tag || Enddatum 01.01.10 || 1 || 0 || 30.01.10 Aber wie schon gesagt, ich denke den Tag abzuziehen ist eher trivial. Danke schonmal für die schnellen Antworten. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 1. Dezember 2010 Teilen Geschrieben 1. Dezember 2010 Das heißt, das Ergebnis kann nie der 31. eines Monats sein? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Staticskill Geschrieben 1. Dezember 2010 Autor Teilen Geschrieben 1. Dezember 2010 richtig Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 1. Dezember 2010 Teilen Geschrieben 1. Dezember 2010 Dann würde ich das so machen: Sei x die Anzahl der zu addierenden Tage. Solange x >= 30: - Monat 1 hochzählen und x um 30 verringern Wenn x > 0 - m = min(30, AnzahlTage(Monat)) - Falls Tag + x > m: -- Monat um 1 hochzählen, Tag = (Tag + x) - m - Sonst -- Tag = Tag + x Tag = min(Tag, 30, AnzahlTage(Monat)) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Staticskill Geschrieben 1. Dezember 2010 Autor Teilen Geschrieben 1. Dezember 2010 Vielen Dank. Habe das so eingebaut und gleichmal getestet, habe jetzt nochmal eine Situation entdeckt die so nicht ganz hinhaut: 01.02. + 27T = 28.02. 01.02. + 28T = 01.03. 01.02. + 29T = 02.03. 01.02. + 30T = 01.03. Umgesetzt hab ich das Ganze wie folgt: int ToYear = FromDate.Year; int ToMonth = FromDate.Month; int ToDay = FromDate.Day; int addday = Value; while (addday >= 30) { if (ToMonth >= 12) { ToYear++; ToMonth = ToMonth - 12; } ToMonth++; addday = addday - 30; } if (addday > 0) { int m = Math.Min(30, DaysInMonth[ToMonth - 1]); if (ToDay + addday > m) { ToMonth++; if (ToMonth > 12) { ToYear++; ToMonth = ToMonth - 12; } ToDay = (ToDay + addday) - m; } else { ToDay = ToDay + addday; } } ToDay = Math.Min(ToDay, Math.Min(30, DaysInMonth[ToMonth - 1])); LZBis = new DateTime(ToYear, ToMonth, ToDay); Hab ich das anhand deines Vorschlags richtig verstanden? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
.NETter Geschrieben 1. Dezember 2010 Teilen Geschrieben 1. Dezember 2010 Hallo ! Ich habe hier mal eine Klasse erstellt (nur Prototyp aber funktionsfähig ) So sollte nach der Instanzierung eines Objekts vom Typ Monat30 der Funktionsaufruf von AddDays() das von Dir gewünschte Ergebnis liefern. Wie gesagt nur ein Prototyp der bestimmt hier und da noch überarbeitet werden kann oder sollte. class Monat30 { public int Monat { get; set; } public int Tag { get; set; } public int Jahr { get; set; } public Monat30 Folgemonat { get; set; } public int AddTage { get; set; } public Monat30(DateTime Startdatum, int Tage) { Jahr = Startdatum.Year; Monat = Startdatum.Month; Tag = Startdatum.Day; AddTage = Tage; } public DateTime AddDays() { if (AddTage >= 360) { Jahr = Convert.ToInt32(Jahr + (Math.Floor((double)AddTage / 360))); AddTage = Convert.ToInt32(AddTage - (Math.Floor((double)AddTage / 360) * 360)); } if (AddTage >= 30) { Monat = Convert.ToInt32(Monat + (Math.Floor((double)AddTage / 30))); if (Monat > 12) { Jahr += Convert.ToInt32(Math.Floor((double)Monat / 12)); Monat = Convert.ToInt32(Monat % 12); } AddTage -= Convert.ToInt32(AddTage - (double)(AddTage % 30)); } if ((AddTage + Tag) > 30) { Monat = Monat + 1; Tag = (AddTage + Tag) - 30; AddTage = AddTage - (AddTage % 30); } else { Tag += AddTage; } if (Monat == 2) { DateTime calcDate = new DateTime(Jahr, 1, 1); if (Tag > 28 && !DateTime.IsLeapYear(calcDate.Year)) { Tag = 28; } else if (Tag > 28 && DateTime.IsLeapYear(calcDate.Year)) { Tag = 29; } } return new DateTime(Jahr, Monat, Tag); } } Viele Grüße, Thomas Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.