torutkのブログ

ソフトウェア・エンジニアのブログ

NTPタイムスタンプフォーマット

昨日のRFC 4193の一意なID生成ロジックにてNTPタイムスタンプフォーマットを生成する必要があります。調べてみるとNTPタイムスタンプは1900年1月1日0時0分0秒を基点とする64bit固定小数点形式で、上位32bitが秒を示します(LSBが1/2^32)。2036年で桁溢れが発生するので、MSBが0のときは2036年を基点とするよう解釈する方法が仕様化されています。

一方、JavaではSystem.currentTimeMillis()で現在時刻が取得できますが、1970年1月1日0時0分0秒を基点とする64bit整数形式でLSBが1ミリ秒を示します。

さて、変換コードをいろいろ書き始めていたところ、jakarta commons netの中に、org.apache.commons.net.ntp.TimeStampクラスがあることが分かりました。このcommons-netは、他のcommonsライブラリには依存していないようです(少なくてもTimeStampに関しては)。自分のコードのテストをcommonsのTimeStampクラスの出力結果と比べ、ずれがあったのでcommonsのロジックを調べて自分のコードを修正し(256秒ずれていた)、一応OKなようです。