Акселерометр SensorEvent отметка времени - PullRequest
23 голосов
/ 31 марта 2011

Я сейчас работаю над приложением для Android. Мне нужно записать координату события датчика акселерометра во время события. Я получил отметку времени события датчика, например «3497855005850», но я не могу преобразовать отметку времени события в читаемый пользователем формат даты и времени. Заранее спасибо

Как я могу преобразовать метку времени SensorEvent в метку времени Unix?

Ответы [ 5 ]

35 голосов
/ 17 февраля 2012

Временная метка датчика - это наносекунды времени безотказной работы, , а не системного времени в наносекундах. См. SensorEvent.timestamp для абсолютной (utc) отметки времени? .

Теоретически вы можете преобразовать временную метку датчика во время в миллисекундах, используя:

long timeInMillis = (new Date()).getTime() 
                    + (sensorEvent.timestamp - System.nanoTime()) / 1000000L;

Вы можете даже заключить вызов (new Date()).getTime() в два вызова System.nanoTime() и усреднить их, чтобы приблизиться к фактическому смещению.

Затем вы можете отформатировать время датчика как дату и время.

3 голосов
/ 24 сентября 2013

Вы можете установить временные переменные в вашей функции onSensorChanged(SensorEvent).

Ссылка на текущее время и время события. Когда событие наступит, вычтите референтное время датчика из времени события, и вы получите разницу в наносекундах. Вы можете добавить эту разницу, разделенную на 1 000 000, к текущему времени, чтобы получить время события в миллисекундах.
Ошибка при вычислении этого значения может составлять максимум 0,5 миллисекунды для одного события. Вы можете минимизировать ошибку, периодически меняя референтное время.

private long sensorTimeReference = 0l;
private long myTimeReference = 0l;

public void onSensorChanged(SensorEvent event) {
    // set reference times
    if(sensorTimeReference == 0l && myTimeReference == 0l) {
        sensorTimeReference = event.timestamp;
        myTimeReference = System.currentTimeMillis();
    }
    // set event timestamp to current time in milliseconds
    event.timestamp = myTimeReference + 
        Math.round((event.timestamp - sensorTimeReference) / 1000000.0);
    // some code...
}
1 голос
/ 02 сентября 2018

Я вижу три способа получить миллис (Котлин)

val millis = Date().getTime() + (event.timestamp - System.nanoTime()) / 1000000L

val millis = System.currentTimeMillis() + (event.timestamp - System.nanoTime()) / 1000000L

val millis = System.currentTimeMillis() + (event.timestamp - SystemClock.elapsedRealtimeNanos()) / 1000000L

все три дают один и тот же результат, но когда я хочу увидеть разницу от вычисленного значения до текущего времени

val diff  = System.currentTimeMillis() - millis

Я вижу 'diff' со значением -359704905 ?

Log.d("diff", "" + event.timestamp + " - " + System.nanoTime())

diff: 541695268300000 - 181990403666592

diff: 541695277240000 - 181990405818592

diff: 541695286859000 - 181990411901592

diff: 541695296139000 - 181990412584592

diff: 541695305735000 - 181990415222592

Так что все предложенные решения ** не верны * 10 10 * ** не верны * 10 10 * ** не верны * 10 10 * ** не верны * 10 10 * ** не верны * 10 10 * ** не верны * 10 10 * ** не верны * 10 10 * ** не правы * 10251026 * для меня этот простой способ соответствует моим потребностям

override fun onSensorChanged(sensorEvent: SensorEvent?) {
    val millis = System.currentTimeMillis()
}
1 голос
/ 12 апреля 2016

У меня была та же проблема, и я использовал решение от ehartwell . Однако я использовал System.currentTimeMillis() вместо new Date().getTime().

Кроме того, я обнаружил, что есть смещение sensorEvent.timeStamp и System.nanoTime() максимум 300 мс, в основном <200 мс. В зависимости от необходимой точности вы можете игнорировать эту разницу. </p>

Если я использую решение Бобана С. , при инициализации разница будет корректной. Однако правильное время и время измерений расходятся. Расчетное время измерений в будущем.

0 голосов
/ 13 ноября 2018

Это варьируется для каждого устройства.Это может быть основано на эпохе, времени с момента загрузки и времени пробуждения процессора.Наилучший подход - прочитать все три, затем посмотреть, какая из них является наиболее близкой к отметке времени, а затем выполнить преобразование на основе смещения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...