11

32 ビット システム用の 64 ビット Unix タイムスタンプ変換の C++ 実装はありますか? struct tmうるう年、タイム ゾーン、UTC を含む 64 ビット整数に変換する必要があります。また、少なくとも GNU/Linux と Windows では移植可能である必要があります。

4

5 に答える 5

13

必要なもの:

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

https://github.com/evalEmpire/y2038

于 2011-11-07T10:30:33.580 に答える
7

struct tm*aを a に変換する関数time_tは ですmktime。それの多くの実装を見つけることができます。Glibc およびlibvxc のmktime.cファイルに含まれています。コードを取得して (合法であると仮定して、ライセンスを尊重してください)、time_tのような 64 ビット整数に変更できint64_tます。

time_tからへの他の変換を行う関数struct tm*localtimeorgmtimeであり、同様に行うことができます。

ただし、より根本的な問題がある可能性があります。2040 年に実行されている 32 ビット マシンには、(timeシステム コールが行うように) の 64 ビット バリアントで現在の時刻を適切に提供する何らかの方法が必要ですtime_tが、それははるかに困難です (カーネルとハードウェアに依存します)。

于 2011-11-04T17:33:13.073 に答える
6

time_t32 ビット システムでは 32 ビットであると仮定しているようですが、これは正しい場合とそうでない場合があります。

Windows では、Visual Studio 2005 以降、time_t32 ビット Windows 用にコンパイルした場合でも、のサイズは 64 ビットです。

不幸な部分は、glibc がそれを として定義していることlong intです。これは、32 ビット システムでは 32 ビット整数です。つまり、32 ビット Linux および gcc/glibc (Cygwin など) に基づくその他の 32 ビット プラットフォームは、64 ビットのタイムスタンプを処理できません。

アプリケーションを 32 ビット glibc で実行する必要がある場合は、独自の変換関数を使用する必要があります。これは、64 ビット タイムスタンプを使用するように再コンパイルされた C ライブラリ内の同じ関数である可能性があります。

許容ライセンス (BSD) のソース コードが必要な場合は、これらの関数を minix3 で確認できます。こちらが現地時間。ソースはハイパーリンクされているため、他のソースを簡単に見つけることができます。

于 2011-11-06T06:22:07.397 に答える
-1

ええ使用stuct tm *_localtime64 ( const __time64_t *timer);

それはあなたの窓のファンならです。

于 2011-11-07T02:34:53.120 に答える