プログラミング言語によって日時の秒未満の精度が異なる点を意識しなければならないケースに先日見舞われ、せっかくなので思いあたるプログラミング言語の秒未満精度をざっと追いかけてみました。親しみのないものも多く誤りがあるのではないかと思いますが、取り急ぎの結果は次のとおり。
言語 | 精度 | 補足 |
---|---|---|
JavaScript | ミリ秒 | ナノ秒対応の標準ライブラリ(Temporal)がリリース待ち |
PHP | マイクロ秒 | |
Python | マイクロ秒 | |
Swift | ミリ秒? | sub-millisecond precisionとの表記あり |
.NET(C#他) | ナノ秒 | 書式化の精度は7桁まで |
C++ | ナノ秒 | |
Go | ナノ秒 | |
Java | ナノ秒(LocalDateTime) | Java 8より前はミリ秒(Date) |
Ruby | ナノ秒 | |
Rust | ナノ秒(Chronoクレート) | |
Haskell | ピコ秒(timeライブラリ) |
おおむねナノ秒に対応済みで、一部マイクロ秒どまりのものが残っているという感じ。しかし.NETの書式化が7桁というのはどんな理由があってのことなのでしょうか……
この精度の違いはたとえば次のケースで問題になります。
- 呼び出し元と呼び出し先で言語が異なる
- 呼び出し元言語より呼び出し先言語のほうが精度が低い
- パラメーター指定の際、秒未満の値を含む日時はISO 8601やRFC 3339などに沿って文字列に書式化
- JSONでの日時指定など
- 呼び出し先言語の日時解釈が厳密
たとえばAmazon Lambda + Pythonで実装したREST APIをナノ秒対応言語で呼び出すとこの条件が満たされます。Pythonの秒未満の値の取り扱いは厳格で6桁より大きい整数の指定をエラーとするからです。
気づいてみればなんてことのない話ですが、ヘテロな環境に慣れていないと気づきにくいかとも思います。本エントリがどなたかの転ばぬ先の杖になれば幸いです。