必要なもの:
typedef long long time64_t;
time64_t mktime64(struct tm *t);
struct tm* localtime64_r(const time64_t* t, struct tm* p);
当初 (2011 年)、この回答には、小さな pivotal_gmtime_r
をダウンロードできる 2038bug.com へのリンクが含まれていました。 上記の関数を含むライブラリ。ライブラリは当時 2038bug.com から削除されており、リンクが壊れてモデレーターによって回答から削除されました。 pivotal_gmtime_r
のようです コードはここにあります:
https://github.com/franklin373/mortage/tree/master/time_pivotal
また、y2038
と呼ばれる別のより最近のライブラリを見つけました。 、 mktime64
も実装しています と localtime64_r
:
https://github.com/evalEmpire/y2038
struct tm*
を変換する関数 time_t
に mktime
です .それの多くの実装を見つけることができます。 Glibc と libvxc の mktime.c
で ファイル。コードを取得して(合法であると仮定して、ライセンスを尊重してください)、 time_t
を変更できます int64_t
のような 64 ビット整数 .
time_t
から他の変換を行う関数 struct tm*
へ localtime
です または gmtime
ただし、より根本的な問題がある可能性があります。2040 年に実行されている 32 ビット マシンには、現在の時刻を取得する何らかの方法が必要です (time
として)。 time_t
の 64 ビット バリアントでは、システム コールが適切に動作します。 、それははるかに困難です (カーネルとハードウェアに依存します)。
time_t
と仮定しているようです は 32 ビット システムでは 32 ビットであり、これは正しい場合とそうでない場合があります。
Windows では、Visual Studio 2005 以降では time_t
のサイズ 32 ビット Windows 用にコンパイルした場合でも、64 ビットです。
残念なことに、glibc では long int
と定義されています。 、32 ビット システムでは 32 ビット整数です。つまり、32 ビット Linux および gcc/glibc (Cygwin など) に基づくその他の 32 ビット プラットフォームは、64 ビットのタイムスタンプを処理できません。
アプリケーションを 32 ビット glibc で実行する必要がある場合は、独自の変換関数を使用する必要があります。これは、64 ビット タイムスタンプを使用するように再コンパイルされた C ライブラリ内の同じ関数である可能性があります。
許容ライセンス (BSD) のソース コードが必要な場合は、これらの関数を minix3 で確認できます。こちらが現地時間。ソースはハイパーリンクされているため、他のソースを簡単に見つけることができます.