【Java】 日付・時間 について ~ System.currentTimeMillis / System.nanoTime ~

 ■ はじめに

 * System.currentTimeMillis() と System.nanoTime() があるのは知ってて、
   時間単位が、ミリ秒 と ナノ秒 の違いだけかと思ったが、
   それだけでなく、出力の計測の仕方が異なっていたので、
   今回は、この2メソッドを掘り下げてみる。

 ■ System.currentTimeMillis()

https://docs.oracle.com/javase/jp/8/docs/api/java/lang/System.html#currentTimeMillis--

 * 時間単位 : ミリ秒

 使用上の注意

 * API仕様の戻り値の説明より
  「ミリ秒で測定した、現在時刻と協定世界時のUTC 1970年1月1日深夜零時との差」なので
   「【OSのシステム時刻】-【1970/01/01 00:00:00】」と理解

 => 例えば、『システム起動中に、OSのシステム日付を変更する』と、
    プログラムが意図しない挙動になる可能性があることに注意
 => OSによって、計測単位、分解能が依存する
    (多くのOSでは、時間の粒度が10ミリ秒程度の単位で計測される)

 ■ System.nanoTime()

https://docs.oracle.com/javase/jp/8/docs/api/java/lang/System.html#nanoTime--

 * From Java v1.5
 * 時間単位 : ナノ秒

 使用上の注意

 * 経過時間を測定するためだけに使用
 * 「time1 < time0」ではなく「time1 - time0 < 0」で比較すべき
   (数値のオーバーフローが発生する可能性があるため)
~~~~~
 long time0 = System.nanoTime();
 ...
 long time1 = System.nanoTime();
~~~~~

 ■ (個人的な)結論

 * 実行前と実行後で差を取って実行時間を計測したい時(例えば、タイマー)には、
   System.nanoTime() を使用した方がいい

 ■ 便利なクラス : java.util.concurrent.TimeUnit

 * From Java v1.5

* toNanos() / toMillis() etc 
 * long timeInNano = TimeUnit.MILLISECONDS.toNanos(20L);
 * long timeInMilli = TimeUnit.NANOSECONDS.toMillis(20_000_000L);

* sleep() 
 * TimeUnit.MILLISECONDS.sleep(20_000_000L);

 参考文献

http://blog.mwsoft.jp/article/30375272.html
http://d.hatena.ne.jp/Nagise/20110221/1298301239
http://eng-entrance.com/java-get-time#SystemjavalangSystem

 関連記事

日付・時間 について ~ 入門編 ~ https://dk521123.hatenablog.com/entry/2014/11/18/235600
日付・時間 について ~ 基本編 ~
https://dk521123.hatenablog.com/entry/2016/10/12/235711
日付・時間 について ~ Java8編 ~
https://dk521123.hatenablog.com/entry/2018/02/24/014650