CPU実験室

誰も見向きもしない古いCPUをいじって動かしてみようというプロジェクトです

NTP実装(3)

イメージ 1

ならば、1900年1月1日午前0時から1970年1月1日午前0時までの経過時間を
差し引けば良いんではないかと。
この70年間の秒数はと・・・うるう年も入れて、おっと1900年はうるう年でないな。
すると25567日、2208988800秒となりました。これをNTP時刻から差し引いて、
変換関数localtime()を呼んだところ、ビルド時にいきなりリンクエラーが発生してしまいました。
エラーメッセージによると、どうもmalloc()関係で文句を言ってるようなんですが
メモリ関係は根が深そうなのであっさり諦め。

手作りだとうるう年とかの処理がめんどくさそうなので代わりになるものがないか検索したところ
ありました・・・
ある日付から何日後の日付とか、その間の日数計算と言うのはC言語の教科書の良い見本みたいですね。
それを参考に使わせてもらい表示処理も出来上がりました。
これなら起点日を1900年にすれば最初の2208988800秒の引き算は要らなかったな。

ところで時間処理における2038年問題とか言われますが1900年からスタートする計時では
もっと早くオーバーフローするんじゃないか?と思い、この関数を使って計算すると

4バイト符号付long変数の時の最大値では
 t1=0x7fffffff;
 ADJ time:2147483647
 現在日時:1968/ 1/20
 現在時刻: 3:14: 7

あれっ?とっくにオーバーフローしてるよ。

4バイト符号無しlong変数の時の最大値では
t1=0xffffffff;

ADJ time:4294967295
現在日時:2036/ 2/ 7
現在時刻: 6:28:15

1970年からの計時で4バイト符号付long変数がオーバーフローする2038年問題
2038/1/19だからこの時期のシステム技術者は大変だろうな、まぁ関係無いか。
あるいはテクノロジのブレークスルーを期待するか。