Es wäre ein Irrtum anzunehmen, dass bei TeX jede Abfrage von `\time`, `\day`, `\month` oder `\year` die zum Zeitpunkt der Abfrage aktuelle Zeit, den Tag, Monat oder das Jahr ergibt. Vielmehr sind das mit Zählern vergleichbare Register, die bei TeX beim Start mit einem entsprechenden Wert initialisiert werden. Während des TeX-Laufs ändert TeX selbst den Inhalt dieser Register nicht. Somit sind sie in gewisser Weise statisch. Allerdings kann der Anwender sie ändern, indem er ihnen einen Wert zuweist.
Beginnen wir dazu mit einem plainTeX-Beispiel:
==============================================
%&tex
TeX run startet \the\time s m after midnight.
\loop\ifnum \pageno<2000 \pageno<40000 This is only a dummy text to waist time.\endgraf\repeat
TeX run ended not \the\time s m after midnight, but later.
\bye
Der TeX-Lauf pdfTeX-Lauf dafür dauert bei mir ca. 6s. 1 Minute. Trotzdem wird auf der ersten und der letzten Seite dieselbe Zeit angezeigt.
Will man nun die Startzeit auch für den Fall erhalten, dass im Dokument ein Zähler verändert wird, so kann man wie üblich den Wert des Zähler in einem anderen Zähler speichern:
%&tex
\newcount\originaltime\originaltime=\time
TeX run startet \the\time s m after midnight. This is also \the\originaltime s.
m.
\time=5000
We've changed the current time to \the\time s, m, but the original time is still
available as \the\originaltime s.
m.
\bye
Werden keine Rechneoperationen o. ä. auf dem ursprünglichen Zähler benötigt, so kann man auch ein Makro definieren, in dem man die Expansion des Wertes des Zählers speichert:
%&tex
\edef\originaltime{\the\time}
TeX run startet \the\time s m after midnight. This is also \originaltime s.
m.
\time=5000
We've changed the current time to \the\time s, m, but the original time is still
available as \originaltime s.
m.
\bye
Das Register `\time` diente hier nur als Beispiel für ein beliebiges Datums- oder Zeitregister von TeX. Man kann es in den Beispielen auch durch `\day`, `\month` oder `\year` ersetzen und erhält entsprechende Ergebnisse. Allerdings ist es ggf. schwierig dafür zu sorgen, dass der TeX-Lauf des ersten Beispiels dann min. einen Tag, einen Monat oder ein Jahr dauert. Daher bot sich `\time` für das Beispiel einfach an.
Wenden wir das auf `\datetime` unter LaTeX an:
==============================================
Zunächst sei erwähnt, dass `\datetime` die aktuelle Zeit in den Zählern `\currenthour`, `\currentminute` und `\currentsecond` speichert. Auch diese werden beim Laden des Pakets einmal gesetzt und sind damit für das gesamte Dokument eigentlich statisch. In der Anleitung ist nirgendwo vorgesehen, diese zu ändern. Für den Fall, dass ein Anwender dies dennoch tut, kann man natürlich alle drei in eigenen Zählern oder eigenen Makros nach dem Laden von `datetime` sichern:
\edef\startsecond{\the\currentsecond}
\edef\startminute{\the\currentminute}
\edef\starthour{\the\currenthour}
Für die Ausgabe einer bestimmten Zeit, kennt `datetime` die Anweisung `\formattime`. Damit genügt
\formattime{\starthour}{\startminute}{\startsecond}
um die gesicherte Startuhrzeit auszugeben. Das Format ist dabei dasselbe, das für `\currenttime` verwendet würde.
Für das Datum verfährt man ggf. entsprechend mit den in der Einleitung erwähnten TeX-Registern, die von `datetime` ebenfalls verwendet werden:
\edef\startday{\the\day}
\edef\startmonth{\the\month}
\edef\startyear{\the\year}
und erhält die entsprechend `\today` formatierte Ausgabe mit
\formatdate{\startday}{\startmonth]{\startyear}
unabhängig davon, ob zwischenzeitlich ein Anwender `\day`, `\month` oder `\year` verändert hat.
Natürlich gibt es keine echte Möglichkeit sicherzustellen, dass die neuen Makros nicht ebenfalls umdefiniert werden. So etwas wie `\static\def` kennt TeX nicht.
Man kann sich auch eine Anweisung definieren, die das Speichern der aktuellen Einstellung übernimmt und zwei weitere für die zugehörigen Ausgaben:
\newcommand*{\savecurrentdatetime}[1]{%
\expandafter\edef\csname #1day\endcsname{\the\day}%
\expandafter\edef\csname #1month\endcsname{\the\month}%
\expandafter\edef\csname #1year\endcsname{\the\year}%
\expandafter\edef\csname #1second\endcsname{\the\currentsecond}%
\expandafter\edef\csname #1minute\endcsname{\the\currentminute}%
\expandafter\edef\csname #1hour\endcsname{\the\currenthour}%
}
\newcommand*{\savedday}[1]{%
\formatdate{\csname #1day\endcsname}{\csname #1month\endcsname}{\csname #1year\endcsname}%
}
\newcommand*{\savedtime}[1]{%
\formattime{\csname #1hour\endcsname}{\csname #1minute\endcsname}{\csname #1second\endcsname}%
}
Nun kann man jederzeit im Dokument beispielsweise mit `\savecurrentdatetime{gespeichert}` die aktuellen Einstellungen der Datums- und Zeitregister sichern und mit `\savedday{gespeichert}\ \savedtime{gespeichert}` die gespeicherten Daten entsprechend `\today` und `\currenttime` anzeigen lassen.
Aber wie gesagt: Das ist nur notwendig, wenn man davon ausgeht, dass innerhalb des Dokument die Datums- und Zeitregister explizit durch den Anwender oder ein Paket geändert werden. TeX selbst ändert diese nicht. Das gilt ebenso für `datetime`.