fresh digitable

めんどくさかったなってことを振り返ったり振り返らなかったりするための記録

SensorEventのtimestampについてのメモ

AndroidSensorEventクラスのtimestampはシステムがスタートしてからの時間(ナノ秒)なので、1970/1/1からの相対時間(ミリ秒)だとおもってSimpleDateFormat#format()とかに突っ込むとものすごい勢いで時間が進んでいくから注意しよう。お兄さんとの約束だ。

そんなこと知っとるわいというネタですが思わずカッとなってしまったので書き残そうと思います。

SensorEventをもらった時のいわゆるUNIX時間をもらいたいときはどうしたらいいんだ?となって書いてみたのが以下のコード。

long eventOccuredTimeMilli = -1;
long eventOccuredTimeNano = -1;

@Override
public void onSensorChanged(SensorEvent event){
   if (eventOccuredTimeMilli < 0){
      eventOccuredTimeMilli = System.currentTimeMillis();
      eventOccuredTimeNano = event.timestamp;
   }
   long unixtime = eventOccuredTimeMilli
             + (event.timestamp - eventOccuredTimeNano) / 1000000;
   // 後略
}

正直すまんかった(AA略

でもどうするのが良いのかもわからんかった(´・ω・`)

リッスンするセンサイベントがひとつだけだったら毎回System.currentTimeMillis()呼んでもいいのかもしれんけど、複数のセンサからデータをもらおうとすると、同じタイミングで起きてるはずなのに違うタイムスタンプが付くことになってしまうのですよね。

SensorEvent.timestampの値ってSystem.nanoTime()でもらえる値と一緒なのかな。C++力低すぎて追いかけきれませんでした。 リスナー作る時に一回調べるだけで済ませたいですよね。


(2013.12.13 追記)

上記とは異なる現象を確認したので続編を書きました。

Xperia Z1のSensorEventのタイムスタンプがナノ秒単位のUNIXタイムだった件 - fresh digitable