バックストーリー:解決しようとしていた時間変換に問題があります。私が取り組んでいるプログラムは、内部日付表現を使用しています。日付は、2000/01/01 からの秒数で表されます。その数はプログラム内で一定です。その数はタイムゾーンに依存する可能性があるため、そうすべきではないと思いました。
2000/01/01 の UNIX エポック開始からの秒数がマシンによって異なるかどうかをテストするための簡単なプログラムを作成しました。
struct tm tm_date;
time_t t_LongDate;
tm_date.tm_year = 2000 - 1900;
tm_date.tm_mon = 1 - 1;
tm_date.tm_mday = 1;
tm_date.tm_hour = 0;
tm_date.tm_min = 0;
tm_date.tm_sec = 0;
t_LongDate = mktime(&tm_date);
printf("result: %lld\n", (long long)t_LongDate);
return 0;
開発マシンでプログラムをコンパイルしたところ、動作しているように見えました。
result: 946681200
次に、バイナリを問題のあるホストにアップロードしました。それは私の仮説を反証しました。秒数は同じでした:
problematic-host# ./a.out
result: 946681200
私は不審者なので、問題のあるホストでプログラムを再コンパイルしてみました。あまり期待していませんが、次のとおりです。
problematic-host# gcc secSinceEpoch.c
problematic-host# ./a.out
result: 946677600
私が最初に予想したように、時間差があります。しかし何が起こった?GCC は私の小さなプログラムを最適化して、ユーザー入力やランダム性のソースに依存していなかったので、定数値を出力するようにしましたか? 私の本当の大きなプログラムでも同じことをしますか? 実際に機能を実行するように強制する方法はありますか?