Zum Inhalt springen

Tage zu Datum addieren (360Tage / Jahr)


Empfohlene Beiträge

Geschrieben

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

Geschrieben
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?

Geschrieben (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 von Staticskill
Geschrieben (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 von Guybrush Threepwood
Geschrieben

@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.

Geschrieben

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))

Geschrieben

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?

Geschrieben

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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...