まくろぐ

Android開発: 3種類のタイムスタンプの使い分け

更新:
作成:

Android において long 型のタイムスタンプを取得する方法には、以下の 3 種類があり、それぞれ意味が異なるため、用途に応じて使い分ける必要があります。

  • System. currentTimeMillis()
    • Epoch (1970-01-01) を基準にしたシステムタイムまでの経過ミリ秒。
    • ユーザがシステムの現在時刻を変更すると、過去にジャンプしたりするので、タイムスタンプベースのタイマーなどに使用するべきではない。時計の UI を表示するときに使用する。
  • android.os.SystemClock. elapsedRealtime()
    • Android 端末をブートしてからの経過ミリ秒。uptimeMillis() とは異なり、スリープ中にもカウントされる。
    • AlarmManager はスリープ中の時間もカウントして発火するので、内部で elapsedRealtime() ベースのタイマを使用する。これは、AlarmManager のタイプで ELAPSED_REALTIME (ELAPSED_REALTIME_WAKEUP) を指定した場合の振る舞いで、RTC (RTC_WAKEUP) を指定すれば、System.currentTimeMillis() ベースのタイマで発火するように指定することもできる。
  • android.os.SystemClock. uptimeMillis()
    • Android 端末をブートしてからの経過ミリ秒。スリープ中にはカウントされない。
    • タイムスタンプベースのタイマーに使用できる。例えば Handler クラスは、uptimeMillis() ベースのタイマを使用して非同期コールバックを発火している。
AlarmManagerHandler.
postAtTime
Handler.
sendMessageAtTime
System.currentTimeMillis

UTC(システム時刻設定で変化)

RTC(_WAKEUP)
××
SystemClock.elapsedRealtime

ブートからの経過時間(スリープ時間含む)

ELAPSED_REALTIME(_WAKEUP)
××
SystemClock.uptimeMillis

ブートからの経過時間(スリープ時間含まず)
×
(スリープ時カウントできないため)
まくろぐ
サイトマップまくへのメッセージ