2012-06-02 2 views
7

У меня проблема с начальным хронометром с определенного времени. Существует объект Дата Я хочу, чтобы мой старт хронометра от:Как установить базовое время Android Chronometer из объекта 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] 

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

Когда я начинаю свой хронометр от основания

chronometer.setBase(SystemClock.elapsedRealtime()); 

- это всегда хорошо работает («00:00» и рост)

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

chronometer.setBase(yesterday.getTime()); 

- это показывает "00: 0 (" и меняет каждую секунду последнюю полукокса в ")", "*", "/" и другие

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

ответ

3

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

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

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

У вас нет. Это не то, для чего стоит Chronometer. Цитирование the documentation for Chronometer:

Вы можете дать ему время начала в elapsedRealtime() развертку, и он отсчитывает от этого, или если вы не дать ему базовое время, он будет использовать время, в которое вы call start().

+0

спасибо Марк. Моя цель - создать цифровые часы, которые показывают продолжительность времени между двумя действиями (хранимыми в базе данных с записью времени). Не могли бы вы посоветовать наилучшую практику для этого? – Vitalliuss

+1

@Vitalliuss: Если время начала и окончания фиксировано в базе данных, просто используйте «TextView», так как ваше значение не изменится. Если ваше время начала фиксируется в базе данных и вы рассчитываете оттуда, вам нужно будет создать свой собственный эквивалент «хронометр», который занимает время начала в 'System.currentTimeMillis()' time, а не 'elapsedRealtime() '. Поскольку ['Chronometer' не очень длинный класс] (https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/Chronometer.java), клонирование и создание собственного достаточно легко. – CommonsWare

+0

Попробуем переписать хронометр для моего проекта. Большое спасибо! – Vitalliuss

19

У меня была аналогичная проблема (дата пришла из внешней службы, а не из базы данных), и я хотел показать, сколько лет было.

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

long lastSuccess = serviceDate.getTime(); //Some Date object 
long elapsedRealtimeOffset = System.currentTimeMillis() - SystemClock.elapsedRealtime(); 
pollAgeView.setBase(lastSuccess - elapsedRealtimeOffset); 
pollAgeView.start(); 
+2

Это гораздо более разумный подход, чем переписывание 'Chronometer' для принятия' Date' и ответы на вопрос лучше, чем текущий принятый ответ. –

+0

Удивительный! Настолько лучше, чем принято. – MidasLefko

+0

Это не очень хорошая идеа, поскольку пользователь может изменить дату с вашего устройства. Итак, как вы синхронизируете реальное время с сервера без использования системного времени? –