Algorithmus für Monatsdifferenz



  • Hallo, ich bin Hobbyprogrammierer und möchte gerne einen Datumsrechner erstellen.

    Dabei müssen z.B. Monatsdifferenzen zwischen zwei Zeitangaben berechnet werden.

    Beispiel: November - März , Ergebnis muß 5 lauten.

    Da man natürlich nicht einfach 11 - 3 rechnen kann, frage ich, ob es da nicht einen Algorithmus für gibt.

    Theoretisch könnte man natürlich alle möglichen Konstellationen in eine Datenbank speichern und dann abfragen, also vermutlich 12^12 Einträge. Aber da könnte man vermutlich ansetzen und durch Verallgemeinerung einen Algorithmus entwickeln.

    Wäre nett, wenn mir da jemand weiterhelfen könnte.


  • Mod

    Der Algorithmus, um Differenzen zu berechnen, nennt sich Subtraktion.

    Du möchtest aber vielleicht gleich etwas weiter denken. Ist die Differenz zwischen 30.11. und 1.12. wirklich 1 Monat? Ist die Differenz zwischen 1.12. und 31.12. wirklich 0 Monate?

    Du wirst jedoch feststellen, wenn man weiter denkt, dass ein Datumsrechner dann sehr schnell sehr kompliziert wird.



  • Datumsrechner schrieb:

    Beispiel: November - März , Ergebnis muß 5 lauten.

    Ob vorwärts oder rückwärts - ich komme einfach nicht auf 5. Erkläre mir die Berechnung.



  • EOP schrieb:

    Datumsrechner schrieb:

    Beispiel: November - März , Ergebnis muß 5 lauten.

    Ob vorwärts oder rückwärts - ich komme einfach nicht auf 5. Erkläre mir die Berechnung.

    Durch einfaches Abzählen: November, Dezember, Januar, Februar, März => 5 Monate

    => Das hat im eigentlichen Sinne nichts mit Subtraktion zu tun. Wenn man klassich subtrahieren wollte, sollte 4 raus kommen.

    @TE: Wenn es nur um Monate geht, würde ich mir mal die Modulo Funktion anschauen. Im speziellen Modulo 12.



  • Datumsrechner schrieb:

    Dabei müssen z.B. Monatsdifferenzen zwischen zwei Zeitangaben berechnet werden.

    Soviel dazu.


  • Mod

    Man könnte einen Haskellinterpreter bemühen:

    GHCi..
    Prelude> length "hallo"
    5
    Prelude> length "November"
    8
    Prelude> length "März"
    4
    Prelude> 8 - 4
    4
    Prelude> 8 + 4
    12
    


  • Haha, der war gut und Mai - Juni = -1.



  • EOP schrieb:

    Haha, der war gut und Mai - Juni = -1.

    -1 % 12 = 11 🤡

    //Edit: Einfach vergessen.... ich brauche erstmal noch ein Kaffee



  • 3 - 4 = -1, da braucht man nicht rummodulen.

    Irgendwie haben wir die eigentliche Aufgabenstellung etwas aus den Augen verloren. Kommt mir jedenfalls so vor. 🙂



  • EOP schrieb:

    3 - 4 = -1, da braucht man nicht rummodulen.

    11 Monate wären es von Juni - Mai, daher kam die Aussage ursprünglich.

    EOP schrieb:

    Irgendwie haben wir die eigentliche Aufgabenstellung etwas aus den Augen verloren. Kommt mir jedenfalls so vor. 🙂

    Kommt mir auch so vor 😃



  • Schlangenmensch, du hast nachtfeuers post wohl nicht genau angesehen und analysiert.



  • Doch... ich denke schon. Nur hat ein Gedankenfehler meinerseits meine nicht ernst gemeinte Anmerkung ziemlich kaputt gemacht. Daher eine kurze Erklärung:

    Du hast zu Nachtfeuers Post den entsprechenden Witz mit Mai - Juni gemacht.
    Ich habe dann (falsch) gedacht, ah, Mai - Juni, sind doch 11 Monate, haha -> also wende ich auf ein "falsches" Ergebnis, eine in einem anderen zusammenhang mögliche Berechnung an und bekomme (zufällig) das richtige Endergebnis.



  • Ich mache keine Witze - bin ein todernster Mensch.



  • Alles klar, dann weiß ich Bescheid.



  • ---



  • Ganz so ausschweifend hättest du das auch nicht kommentieren müssen, Gregor.



  • EOP schrieb:

    Ganz so ausschweifend hättest du das auch nicht kommentieren müssen, Gregor.

    Ich hatte festgestellt, dass das, was ich geschrieben hatte, unausgereift war, wollte das aber auch nicht mehr korrigieren.

    ...und eigentlich sollte der Threadersteller dieses Problemchen zuerst mal für sich selbst klar und deutlich formulieren und dann ganz alleine lösen. Das gehört zu dieser Art von Problemen, die man beim Programmieren drei mal am Tag löst, auch wenn man dafür vielleicht mal 10 Minuten knobeln muss. Wenn jemand an so etwas scheitert und nach einer vorgefertigten Lösung ruft, sollte er lieber etwas anderes machen als programmieren. Dann fehlt nämlich sowohl Talent, als auch Interesse oder auch einfach ganz grundlegendes Verständnis mathematischer Operationen, die man beim Programmieren andauernd braucht, wie zum Beispiel die Subtraktion, die Modulo-Berechnung, das Bestimmen des Minimums zweier Werte, die Bestimmung eines Absolutbetrags eines Werts.

    @Threadersteller: Sorry für dieses Arschlochkommentar. Gib Dir nen Ruck und versuch es noch mal selbst ein bisschen. Es ist nicht so schwer. 😉



  • Weil du recht hast, Gregor, kamen auch nur wenige konstruktive Beiträge.
    Das grundlegende Problem der Denkfaulheit haben anscheinend auch Andere erkannt.


  • Mod

    @Gregor du hast die bereits von Schlangenmensch angedeutete Kombinatorik vergessen.



  • SeppJ schrieb:

    Der Algorithmus, um Differenzen zu berechnen, nennt sich Subtraktion.

    Stimmt, es ist einfach eine Frage der Subtraktion, war in der Zwischenzeit auch selber drauf gekommen, der Post im Forum hat quasi dazu geführt.

    Mann kann ja einfach Jahr für Jahr rechnen, also ensprechend von November - Dezember= (12-11)+1 = 2 und dann nochmal einfach 3 dazu addieren. (Januar-März).
    Vorher müßte man natürlich noch die Jahre abgleichen, um festzustellen, welcher Wert der geringere ist.

    SeppJ schrieb:

    Du möchtest aber vielleicht gleich etwas weiter denken. Ist die Differenz zwischen 30.11. und 1.12. wirklich 1 Monat? Ist die Differenz zwischen 1.12. und 31.12. wirklich 0 Monate?

    Neiin, natürlich nicht :-), mein Ansatz wäre der, ein Datum in 3 Variablen aufzuteilen, also Jahr, Monat, Tag. Dann werden zunächst alle wichtigen Eigenschaften abgefragt, also z.B. Schaltjahr, 30 Tage oder 31 Tage, etc. Anschließend wird, wenn notwendig, subtrahiert.

    SeppJ schrieb:

    Du wirst jedoch feststellen, wenn man weiter denkt, dass ein Datumsrechner dann sehr schnell sehr kompliziert wird.

    Ja, das habe ich mittlerweile auch festgestellt, daß ein eigentlich ganz einfacher zu scheinender Datumsrechner für Hobbyprogrammierer(bisschen VB und bisschen C++, bestenfalls Grundlagenkenntnisse und Inselwissen) nicht mal eben zu programmieren ist. Aber Zeit ist nicht das Problem 🙂


Log in to reply