32 ビット システム用の 64 ビット Unix タイムスタンプ変換の C++ 実装はありますか? struct tm
うるう年、タイム ゾーン、UTC を含む 64 ビット整数に変換する必要があります。また、少なくとも GNU/Linux と Windows では移植可能である必要があります。
5 に答える
必要なもの:
typedef long long time64_t;
time64_t mktime64(struct tm *t);
struct tm* localtime64_r(const time64_t* t, struct tm* p);
当初 (2011 年)、この回答には 2038bug.com へのリンクが含まれていました。ここではpivotal_gmtime_r
、言及された機能を含む小さなライブラリをダウンロードできました。ライブラリは当時 2038bug.com から削除されており、リンクが壊れてモデレーターによって回答から削除されました。そのpivotal_gmtime_r
コードはここで見つけることができるようです:
https://github.com/franklin373/mortage/tree/master/time_pivotal
y2038
また、と も実装mktime64
していると呼ばれる、より最近の別のライブラリを見つけましたlocaltime64_r
。
struct tm*
aを a に変換する関数time_t
は ですmktime
。それの多くの実装を見つけることができます。Glibc およびlibvxc のmktime.c
ファイルに含まれています。コードを取得して (合法であると仮定して、ライセンスを尊重してください)、time_t
のような 64 ビット整数に変更できint64_t
ます。
time_t
からへの他の変換を行う関数struct tm*
はlocaltime
orgmtime
であり、同様に行うことができます。
ただし、より根本的な問題がある可能性があります。2040 年に実行されている 32 ビット マシンには、(time
システム コールが行うように) の 64 ビット バリアントで現在の時刻を適切に提供する何らかの方法が必要ですtime_t
が、それははるかに困難です (カーネルとハードウェアに依存します)。
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 で確認できます。こちらが現地時間。ソースはハイパーリンクされているため、他のソースを簡単に見つけることができます。
ええ使用stuct tm *_localtime64 ( const __time64_t *timer);
それはあなたの窓のファンならです。