端末時間変更に負けないAndroidストップウォッチ
アプリを作っている時に、AとBの経過時間を測りたい、という要件があったとします。
よくある実装はこんな感じです。
long startTime = -1;
long endTime = -1;
public void start() {
startTime = getTimeMillis();
}
public long stop() {
endTime = getTimeMillis();
return endTime - startTime;
}
private static Long getTimeMillis() {
return System.nanoTime() / 1000000;
}
ここでポイントなのは、時間取得にSystem#currentTimeMillis()ではなくSystem#nanoTime()を使うことです。
currentTimeMillisとは端末時間をunix時間で取得するもので、nanoTimeは起動からの経過時間がもとになっています。
Androidの場合、ユーザーによって端末の日付やタイムゾーンがころころ変えられることが考えられますよね。
その場合でも正しく動くストップウォッチを作るならば、nanoTimeを使うのです。
ちなみに、nanoTimeでは現在時刻は判定できないので、現在時刻をベースに考えないといけない場合は、currentTimeMillisです。
確かにAndroidでよく使われるのはcurrentTimeMillisなのかもしれないですね。nanoまでの精度は不要とか。
私は古きよきjava畑出身なので、割と馴染みがあったりします。
仕事をしていて、あまり知られていないのかなと思ったので記事にしました。