Вопрос по android – Как установить базовое время Android Chronometer из объекта Date?

8

У меня проблема с запуском хронометра в указанное время. Есть объект Date, с которого я хочу запустить хронометр:

Date d = new Date(); //now, just for example
chronometer.setBase(d.getTime()); //long value of d
Log.d("Date: " , "d.getTime() time is [" + d.getTime() +"]");
Log.d("Chron: " , "chronometer.getBase() is [" + chronometer.getBase() +"]");
//let's print out elapsedRealtime from official sample
Log.d("Chron: " , "SystemClock.elapsedRealtime() is [" + SystemClock.elapsedRealtime() +"]");

Выход:

06-02 13:35:23.025: D/Date:(928): d.getTime() time is [1338644123032]
06-02 13:35:23.037: D/Chron:(928): chronometer.getBase() is [1338644123032]
06-02 13:35:23.037: D/Chron:(928): SystemClock.elapsedRealtime() is [11624388]

Собственно, почему эти длинные значения времени отличаются (11624388 и 1338644123032)?

Когда я запускаю свой хронометр с базы

chronometer.setBase(SystemClock.elapsedRealtime());

- он всегда работает нормально («00: 00» и растет)

Но когда я пытаюсь установить дату из прошедшей даты (например, вчера):

chronometer.setBase(yesterday.getTime());

- он отображает «00: 0» (и каждую секунду меняет последний символ на «)», «*», «/»; и другие

Не могли бы вы посоветовать, как я могу установить основание хронометра для объекта Date?

Ваш Ответ

2   ответа
23

службы, а не из базы данных), и я хотел показать, сколько лет было дате.

Это оказалось просто:

long lastSuccess = serviceDate.getTime(); //Some Date object
long elapsedRealtimeOffset = System.currentTimeMillis() - SystemClock.elapsedRealtime();
pollAgeView.setBase(lastSuccess - elapsedRealtimeOffset);
pollAgeView.start();
Это гораздо более разумный подход, чем переписываниеChronometer принятьDate и отвечает на вопрос лучше, чем текущий принятый ответ.
Это не очень хорошая идея, так как пользователь может изменить дату с вашего устройства. Итак, как вы синхронизируете реальное время с сервера без использования системного базового времени?
Потрясающие! Намного лучше, чем принятый ответ.
2

why this long values of time differes (11624388 and 1338644123032)?

SystemClock.elapsedRealtime() количество миллисекунд с момента включения устройства. Другие значения основаны наSystem.currentTimeMillis()количество миллисекунд с начала эпохи Unix.

Could you please advise how can I set the chronometer base to a Date object?

Вы не т. Это не то, чтоChronometer для. квотированиедокументация дляChronometer:

You can give it a start time in the elapsedRealtime() timebase, and it counts up from that, or if you don't give it a base time, it will use the time at which you call start().

Спасибо Марк. Моя цель - создать цифровые часы, которые показывают продолжительность времени между двумя действиями (хранятся в базе данных с записью времени). Не могли бы вы посоветовать лучшую практику для этого? Vitalliuss
@Vitalliuss: Если ваше время начала и окончания зафиксировано в базе данных, просто используйтеTextView, так как ваша ценность не изменится. Если ваше время начала зафиксировано в базе данных, и вы рассчитываете оттуда, вам нужно будет создать свой собственныйChronometer эквивалент, который занимает время начала вSystem.currentTimeMillis() время, а неelapsedRealtime(), посколькуChronometer is not a very long class, клонирование и создание собственного должно быть достаточно легко.
Постараюсь переписать Хронометр для моего проекта. Большое спасибо! Vitalliuss

Похожие вопросы