Lösung:
Ich nahm die Idee von Percusse und sprang sozusagen in den Kaninchenbau. Es berücksichtigt jedoch sicherlich keine gregorianischen / julianischen Manipulationen und vor allem wird ein Sternchen nach dem Tag gedruckt, an dem es erforderlich ist annehmen der Monat hat 30 Tage.
Aber seien wir ehrlich, das Format von Jahren, Monaten und Tagen ist von Natur aus mehrdeutig. Man kann mir sicherlich sagen, wie viele Tage es vom 24. April bis zum 23. Mai hat, aber ich behaupte, Sie können mir nicht sagen, wie viele Monate und Tage es vom 24. März bis 23. Mai sind. Es kommt darauf an, ob ich den Monat vom 24. März bis zum 24. April zähle und dann die restlichen Tage zähle gegen Zählen Sie den Monat als 23. April bis 23. Mai und zählen Sie dann die verbleibenden Tage.
documentclass{article}
usepackage{listofitems}
newcommandgetage[1]{%
setsepchar[,]{/}%
readliststarting{#1}%
edefagedays{thenumexprtheday-starting[1]relax}%
edefagemonths{thenumexprthemonth-starting[2]relax}%
edefageyears{thenumexprtheyear-starting[3]relax}%
ifnumagedays<0relax
edefagemonths{thenumexpragemonths-1relax}%
edefagedays{thenumexpragedays+30relax*}%
fi
ifnumagemonths<0relax
edefageyears{thenumexprageyears-1relax}%
edefagemonths{thenumexpragemonths+12relax}%
fi
From #1 to theday/themonth/theyear{} is
ageyears{} years, agemonths{} months, and agedays{} days.%
}
begin{document}
getage{10/02/1989}
getage{10/07/1989}
getage{23/07/1989}
getage{24/07/1989}
end{document}
Hier gehe ich noch einen Schritt weiter und berechne Tage, angenommen, ich zähle Tage ab dem letzten Monat vor dem Enddatum. Beachten Sie, dass dies, wenn Sie so wollen, definiert, wie Monate + Tage gezählt werden. So vermeidet es Mehrdeutigkeiten nur per Definition. Und es berücksichtigt immer noch keine Schaltjahre, und daher jede Berechnung, die im März eines Schaltjahres endet, für das der Start day
überschreitet das Ende day
wird um 1 Tag ausfallen. BEARBEITET, um Berechnungen mit einem Trailing zu kennzeichnen dag
welcher können dem Schaltjahrfehler unterliegen.
REEDITED, um die Angabe des Enddatums als optionales Argument zu ermöglichen (Standard today
).
documentclass{article}
usepackage{listofitems}
newcommandgetage[2][relax]{bgroup%
setsepchar[,]{/}%
ifxrelax#1relaxelse
readlistending{#1}%
day=ending[1]relax%
month=ending[2]relax%
year=ending[3]relax%
fi%
readliststarting{#2}%
xdefagedays{thenumexprtheday-starting[1]relax}%
xdefagemonths{thenumexprthemonth-starting[2]relax}%
xdefageyears{thenumexprtheyear-starting[3]relax}%
ifnumagedays<0relax
monthlength{themonth}%
xdefagemonths{thenumexpragemonths-1relax}%
xdefagedays{thenumexpragedays+themonthlengthrelax}%
fi
ifnumagemonths<0relax
xdefageyears{thenumexprageyears-1relax}%
xdefagemonths{thenumexpragemonths+12relax}%
fi
From #2 to theday/themonth/theyear{} is
ageyears{} years, agemonths{} months, and agedays{} days%
ifnummonth=3relaxifnumstarting[1]>dayrelax$^{dag}$fifi.%
egroup}
newcommandmonthlength[1]{%
edefthemonthlength{%
% PRIOR MONTH: DEC JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV
ifcase#1 xxor31or31or28or31or30or31or30or31or31or30or31or30fi%
}%
}
begin{document}
getage{10/02/1989}par
getage{10/07/1989}par
getage{23/07/1989}par
getage{24/07/1989}par
getage{24/04/2017}par
getage{24/03/2017}par
getage[23/3/2017]{24/02/2017}par
getage[23/11/2017]{24/10/2017}par
getage[01/05/2017]{10/02/1989}
end{document}
Ich kann Ihnen die Anzahl der Tage nennen, aber ich gehe nicht in den Kaninchenbau hinein, in dem ich in Jahre, Monate, Tage umrechnen muss, je nachdem, wann und wo dies geschieht.
BEARBEITEN: Lokale Änderungssachen, nur um Paketautoren nicht wütend zu machen ...
documentclass{article}
usepackage{pgfkeys,pgfcalendar}
makeatletter
defmydatediff#1{%
begingroup%
pgfcalendardatetojulian{#1}{@tempcnta}%
pgfcalendardatetojulian{year-month-day}{@tempcntb}%
advance@tempcntb-@tempcntarelax%
expandafteraftergroupthe@tempcntb%
endgroup%
}
begin{document}
mydatediff{2007-01-14}...
end{document}