Sie benötigen:
typedef long long time64_t;
time64_t mktime64(struct tm *t);
struct tm* localtime64_r(const time64_t* t, struct tm* p);
Ursprünglich (2011) enthielt diese Antwort Links zu 2038bug.com, wo es möglich war, den kleinen pivotal_gmtime_r
herunterzuladen Bibliothek, die die genannten Funktionen enthält. Die Bibliothek wurde damals von 2038bug.com entfernt, die Links gingen kaputt und wurden von einem Moderator aus der Antwort entfernt. Scheint so pivotal_gmtime_r
Code kann jetzt hier gefunden werden:
https://github.com/franklin373/mortage/tree/master/time_pivotal
Außerdem habe ich eine andere, neuere Bibliothek namens y2038
gefunden , das auch mktime64
implementiert und localtime64_r
:
https://github.com/evalEmpire/y2038
Die Funktion konvertiert einen struct tm*
zu einem time_t
ist mktime
. Sie können viele Implementierungen davon finden, z. in Glibc und in mktime.c
von libvxc Datei. Sie könnten den Code nehmen (vorausgesetzt, er ist für Sie legal, also respektieren Sie bitte die Lizenzen) und time_t
ändern zu einer 64-Bit-Ganzzahl wie int64_t
.
Die Funktionen, die die anderen Konvertierungen von time_t
durchführen bis struct tm*
sind localtime
oder gmtime
und Sie könnten dasselbe tun.
Möglicherweise haben Sie jedoch ein grundlegenderes Problem:Ihre 32-Bit-Maschine, die im Jahr 2040 läuft, sollte eine Möglichkeit haben, Ihnen die aktuelle Uhrzeit anzuzeigen (als time
Systemaufruf tut) entsprechend in der 64-Bit-Variante von time_t
, und das ist viel schwieriger (es hängt vom Kernel und der Hardware ab).
Sie scheinen davon auszugehen, dass time_t
ist 32-Bit auf 32-Bit-Systemen, und dies kann wahr sein oder auch nicht.
Unter Windows ab Visual Studio 2005 die Größe time_t
ist 64-Bit, auch wenn Sie für 32-Bit-Windows kompilieren.
Der unglückliche Teil ist, dass glibc es als long int
definiert , was auf 32-Bit-Systemen eine 32-Bit-Ganzzahl ist. Das bedeutet, dass 32-Bit-Linux und andere 32-Bit-Plattformen, die auf gcc/glibc (wie Cygwin) basieren, nicht mit 64-Bit-Zeitstempeln arbeiten können.
Wenn Ihre Anwendung auf 32-Bit-glibc ausgeführt werden muss, sollten Sie Ihre eigenen Konvertierungsfunktionen verwenden, die die gleichen Funktionen in der C-Bibliothek sein könnten, die neu kompiliert wurde, um 64-Bit-Zeitstempel zu verwenden.
Wenn Sie Quellcode mit einer freizügigen Lizenz (BSD) benötigen, können Sie sich diese Funktionen in minix3 ansehen. Hier ist Ortszeit. Die Quelle ist verlinkt, sodass Sie die anderen leicht finden können.