GNU/Linux >> LINUX-Kenntnisse >  >> Linux

64-Bit-Unix-Zeitstempelkonvertierung

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.


Linux
  1. Ist Mac OS X Unix?

  2. So konvertieren Sie DATE in UNIX TIMESTAMP im Shell-Skript unter MacOS

  3. Gibt es eine Möglichkeit, 64-Bit-time_t in 32-Bit-Programmen unter Linux zu erhalten?

  4. Führen Sie die 64-Bit-App auf einem 32-Bit-Ubuntu-System aus

  5. Überprüfen Sie, welche 32-Bit-Pakete auf einem 64-Bit-Server installiert sind

Ist Ihr Ubuntu ein 32-Bit- oder ein 64-Bit-Betriebssystem?

Ist Ihr Ubuntu ein 32-Bit- oder ein 64-Bit-Betriebssystem? [GUI + Terminal]

Linux gegen Unix

So erkennen Sie, ob es sich um eine 32-Bit- oder 64-Bit-Version von Linux handelt

Wie kann ich überprüfen, ob das Linux-System 32-Bit oder 64-Bit ist?

32-Bit-, 64-Bit-CPU-Betriebsmodus unter Linux