Erster Ansatz:
==============
Das Paket `datetime` definiert `\today` nicht expandierbar um. Ebenso ist `\currenttime` nicht expandierbar. Solange man dieses Paket verwendet, kann man also das aktuelle Datum und die aktuelle Zeit nicht expandiert in eine Datei schreiben, um es für spätere LaTeX-Läufe zu konservieren.
Wenn man allerdings auf das Paket verzichtet, dann geht:
\documentclass[a4paper]{article}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\makeatletter
\@tempcnta\time\divide\@tempcnta60\multiply\@tempcnta60
\@tempcntb\time\advance\@tempcntb-\@tempcnta
\divide\@tempcnta60
\edef\thisruntime{%
\ifnum\@tempcnta<10 0\fi\the\@tempcnta:%
\ifnum\@tempcntb<10 0\fi\the\@tempcntb:%
00%
}
\AtBeginDocument{%
\immediate\write\@auxout{%
\string\gdef\string\firstrundatetime{\firstrundatetime}%
}%
}
\makeatother
\newcommand*{\dyntime}{\today\ \thisruntime}
\newcommand*{\firstrundatetime}{\dyntime}
\begin{document}
\dyntime
\firstrundatetime
\end{document}
Die Definition von `\thisruntime` habe ich mir dabei aus de Paket [`scrtime`](http://www.ctan.org/pkg/koma-script) abgeschaut.
Wie funktioniert das ganze?
===========================
Beim ersten LaTeX-Lauf wird `\firstrundatetime` zunächst als das aktuellen Datum und die Expansion der aktuellen Uhrzeit definiert. Während `\begin{document}` wird in die `aux`-Datei eine Neudefinition von `\firstrundatetime` geschrieben, deren Inhalt genau der (beim Schreiben expandierte) aktuelle Inhalt von `\firstrundatetime` ist. Das genaue Ergebnis der Expansion beim Schreiben kann man sich in der `aux`-Datei nach dem ersten Lauf anschauen.
Bei jedem weiteren LaTeX-Lauf wird zwar zunächst ebenfalls `\firstrundatetime` als das aktuelle Datum und die Expansion der aktuellen Uhrzeit definiert, allerdings wird dann die `aux`-Datei gelesen und somit `\firstrundatetime` auf den Wert aus der `aux`-Datei gesetzt. Erst dann wird die Neudefinition von `\firstrundatetime` wieder in die `aux`-Datei geschrieben. Damit steht in der `aux`-Datei unabhängig davon, ob das nun der zweite, dritte oder 100. LaTex-Lauf ist, immer Datum und Uhrzeit des ersten LaTeX-Laufs. Um das Ganze zurück zu setzen, löscht man einfach die `aux`-Datei. Das bedeutet natürlich auch, dass man die `aux`-Datei nicht löschen darf, solange das Datum erhalten bleiben soll.
Statt der `aux`-Datei könnte man natürlich auch eine eigene Datei verwenden. Diese müsste dann ebenfalls per `\AtBeginDocument` zunächst gelesen und dann geschrieben werden.
werden. Will man Informationen über einen LaTeX-Lauf hinaus retten, muss man bei TeX grundsätzlich Informationen in eine Datei zusätzliche Datei schreiben. Die aktuelle Datei kann man bei TeX nicht verändern. Ohne Informationen in eine Datei zu schreiben, kann man Informationen grundsätzlich nicht erhalten. Daher geht es nicht ohne so eine Datei. Die Verwendung der `aux`-Datei liegt dabei nahe, ist aber – wie gesagt – nicht zwingend.
Mit `datetime`:
===============
Ausgehend von diesem ersten Ansatz ohne `datetime` und der zuvor erklärten Funktion, kann man nun auch eine Lösung mit `datetime` basteln. Das Problem, dass `\today` und `\currenttime` nicht expandierbar sind, bleibt natürlich bestehen. Für `\currenttime` ist der einfachste Ausweg bei `\thisruntime` aus dem ersten Ansatz zu bleiben. Für `\today` bietet `datetime` selbst eine Lösung. Das Paket bietet nämlich die Möglichkeit, mit `\newdate` ein Datum aufgrund nummerischer Daten zu definieren und dieses Datum dann mit `\displaydate` entsprechend der Formatierung von `\today` ausgeben zu lassen. Die nummerischen Daten des Datums eines LaTeX-Laufs können wir wie im ersten Ansatz für die Uhrzeit gezeigt, expandieren:
\documentclass[a4paper]{article}
\usepackage[ngerman]{babel}
\usepackage[utf8]{inputenc}
\usepackage{datetime}
\makeatletter
\@tempcnta\time\divide\@tempcnta60\multiply\@tempcnta60
\@tempcntb\time\advance\@tempcntb-\@tempcnta
\divide\@tempcnta60
\edef\thisruntime{%
\ifnum\@tempcnta<10 0\fi\the\@tempcnta:%
\ifnum\@tempcntb<10 0\fi\the\@tempcntb:%
00%
}
\edef\thisrunday{\the\day}%
\edef\thisrunmonth{\the\month}%
\edef\thisrunyear{\the\year}%
\AtBeginDocument{%
\immediate\write\@auxout{%
\string\gdef\string\firstrunday{\firstrunday}%
\string\gdef\string\firstrunmonth{\firstrunmonth}%
\string\gdef\string\firstrunyear{\firstrunyear}%
\string\gdef\string\firstruntime{\firstruntime}%
}%
\newdate{firstrundate}{\firstrunday}{\firstrunmonth}{\firstrunyear}%
}
\makeatother
\newcommand*{\dyntime}{\today\ \thisruntime}
\newcommand*{\firstruntime}{\thisruntime}
\newcommand*{\firstrunday}{\thisrunday}
\newcommand*{\firstrunmonth}{\thisrunmonth}
\newcommand*{\firstrunyear}{\thisrunyear}
\newcommand*{\firstrundatetime}{\displaydate{firstrundate}\ \firstruntime}
\begin{document}
\dyntime
\firstrundatetime
\end{document}