Hi,

ich möchte in Latex berechnen wie viele Monate seit einem bestimmten Datum z.B. 2 (Februar) 2015 bis zum aktuellen Datum vergangen sind und die Anzahl der Monate dann in Latex ausgeben, also 11+12+8=31 (für 16. Sept. 2017 als aktuelles Datum) die 31 dann im fertigen Dokument automatisch stehen haben.

Habe schon gesucht, aber nichts gefunden. Kann mir jemand helfen?

gefragt 16 Sep '17, 13:36

x545's gravatar image

x545
111
Akzeptiert-Rate: 0%

1

Hallo @x545, hilft dir https://tex.stackexchange.com/questions/14518/difference-between-two-dates weiter?

Wenn ja, kann ja jemand versuchen es für hier zu übersetzen.

(18 Sep '17, 11:15) NobbZ

So schwer ist die Berechnung eigentlich nicht. Man muss ja nur die Jahre voneinander abziehen und mit 12 multiplizieren und die Monate voneinander abziehen. Außerdem muss man noch prüfen, ob zwischen dem Starttag und dem Endtag überhaupt ein voller Monat liegt und zwischen dem Startmonat und dem Endmonat ein volles Jahr:

Öffne in Overleaf
\documentclass{article}
\usepackage[utf8]{inputenc}

\usepackage{scrbase}

\makeatletter
\newcommand*{\monthdist}[2]{%
  \begingroup
    \splitisodate{#1}\relax
    \@tempcnta\year
    \@tempcntb\month
    \count@=\day
    \splitisodate{#2}\relax
    \ifnum \@tempcntb>\month \advance\year\m@ne\fi
    \ifnum \count@>\day \advance\month\m@ne\fi
    \advance\month-\@tempcntb
    \advance\year-\@tempcnta
    \advance\month\numexpr \year*12\relax
    \the\month
  \endgroup
}
\newcommand*{\splitisodate}[1]{\expandafter\@splitisodate#1---\@nil}%
\newcommand*{\@splitisodate}{}
\def\@splitisodate#1-#2-#3-#4\@nil{%
  \IfArgIsEmpty{#1}{\year=0}{\year=#1}%
  \IfArgIsEmpty{#2}{\month=1}{\month=#2}%
  \IfArgIsEmpty{#3}{\day=1}{\day=#3}%
}
\makeatother
\newcommand*{\monthtillnow}[1]{%
  \begingroup
    \edef\isotoday{\the\year-\the\month-\the\day}%
    \monthdist{2015-2}{\isotoday}% 
  \endgroup
}

\begin{document}
\begin{tabular}{llr}
  Von & Bis & Monate \\
  \hline
  10. Februar 2017 & 11. Februar 2017 & \monthdist{2017-2-10}{2017-2-11} \\
  10. Februar 2017 & 11. März 2017 & \monthdist{2017-2-10}{2017-3-11} \\
  11. Februar 2016 & 10. Februar 2017 & \monthdist{2016-2-11}{2017-2-10} \\
  Februar 2015 & 16. September 2017 & \monthdist{2015-2}{2017-9-16} \\
  Februar 2015 & heute & \monthtillnow{2015-2} \\
\end{tabular}  
\end{document}

alt text

Mit der Distanz in Tagen wäre es deutlich schwieriger, weil man dort Schaltjahre berücksichtigen müsste. Das ist bei der Distanz in Monaten aber nicht notwendig.

Wie im Beispiel zu sehen, muss bei \monthdist zuerst das Startdatum in ISO-Schreibweise angegeben werden und dann das Enddatum. Für das Zerlegen des ISO-Datums werden in \splitisodate die normalen Zähler für Jahr, Monat und Tag verwendet. Das setzt also genau genommen das aktuelle Datum auf das angegebene. Deshalb wird in \monthdist mit \begingroup und \endgroup eine Gruppe aufgespannt. So bleibt diese Änderung auf \monthdist beschränkt. Daher können auch unbesorgt \@tempcnta, \@tempcntb und \count@ zum Zwischenspeichern des aufgeteilten Startdatums verwendet werden. \m@ne ist übrigens -1, aber im Gegensatz zu -1 nur ein Token.

Permanenter link

beantwortet 21 Sep '17, 09:12

gast3's gravatar image

gast3
(ausgesetzt)
Akzeptiert-Rate: 53%

bearbeitet 21 Sep '17, 09:24

Deine Antwort
Vorschau umschalten

Folgen dieser Frage

Per E-Mail:

Wenn sie sich anmelden, kommen Sie für alle Updates hier in Frage

Per RSS:

Antworten

Antworten und Kommentare

Markdown-Grundlagen

  • *kursiv* oder _kursiv_
  • **Fett** oder __Fett__
  • Link:[Text](http://url.com/ "Titel")
  • Bild?![alt Text](/path/img.jpg "Titel")
  • nummerierte Liste: 1. Foo 2. Bar
  • zum Hinzufügen ein Zeilenumbruchs fügen Sie einfach zwei Leerzeichen an die Stelle an der die neue Linie sein soll.
  • grundlegende HTML-Tags werden ebenfalls unterstützt

Frage-Themen:

×19

gestellte Frage: 16 Sep '17, 13:36

Frage wurde gesehen: 5,036 Mal

zuletzt geändert: 21 Sep '17, 09:24