Quantcast
Channel: プログラム の個人的なメモ
Viewing all articles
Browse latest Browse all 860

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

$
0
0

■ はじめに

 * 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);


関連記事

【Java】 日付・日時 について ~ 入門編 ~

https://blogs.yahoo.co.jp/dk521123/34258544.html

【Java】 日付・日時 について ~ 応用編 ~

https://blogs.yahoo.co.jp/dk521123/36434444.html

【Java】【Linux】JavaからLinuxのシステム日付を変更するには...

https://blogs.yahoo.co.jp/dk521123/36764293.html

Viewing all articles
Browse latest Browse all 860

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>