端末時間変更に負けない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畑出身なので、割と馴染みがあったりします。
仕事をしていて、あまり知られていないのかなと思ったので記事にしました。