GNU/Linux >> Linux の 問題 >  >> Linux

64 ビット Unix タイムスタンプ変換

必要なもの:

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_tmktime です .それの多くの実装を見つけることができます。 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 で確認できます。こちらが現地時間。ソースはハイパーリンクされているため、他のソースを簡単に見つけることができます.


Linux
  1. MacOS のシェルスクリプトで DATE を UNIX TIMESTAMP に変換する方法

  2. Linux の 32 ビット プログラムで 64 ビットの time_t を取得する方法はありますか?

  3. Linux バイナリ ファイルが 32 ビットか 64 ビットかを判断する方法は?

  1. ハードウェアと OS のビット数を確認する方法は?

  2. Linux での 32 ビット、64 ビット CPU op モード

  3. 32 ビット Ubuntu システムで 64 ビット アプリを実行する

  1. Mac Os X Unixですか?

  2. 64ビットから32ビットにダウングレードする方法は?

  3. 64 ビット サーバーにインストールされている 32 ビット パッケージを確認する