2012-06-02 9 views
7

Tengo un problema con el inicio del cronómetro a partir de la hora específica. Hay un objeto Date Quiero mi salida del cronómetro:¿Cómo establecer el cronómetro Android base desde el objeto 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() +"]"); 

Salida:

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] 

En realidad, ¿por qué este largo valores de Difiere de tiempo (11624388 y 1338644123032)?

Cuando comienzo mi cronómetro de la base

chronometer.setBase(SystemClock.elapsedRealtime()); 

- siempre funciona bien ("00:00" y en aumento)

Pero cuando intento para establecer la fecha de un pasado Fecha (Fe ayer):

chronometer.setBase(yesterday.getTime()); 

- se muestra "00: 0 (" y cambia cada segundo la última char a ")", "*", "/", y otros

¿Podría avisar cómo puedo configurar la base del cronómetro en un objeto Date?

Respuesta

3

En realidad, ¿por qué difieren estos largos valores de tiempo (11624388 y 1338644123032)?

SystemClock.elapsedRealtime() es la cantidad de milisegundos desde que se encendió el dispositivo. Los otros valores se basan en System.currentTimeMillis(), la cantidad de milisegundos desde la época de Unix.

¿Podría indicarnos cómo puedo configurar la base del cronómetro en un objeto Date?

Usted no lo hace. Eso no es para lo que es Chronometer. Citando the documentation for Chronometer:

Se puede dar una hora de inicio en el elapsedRealtime() base de tiempo, y que cuenta hasta de eso, o si no lo das una base de tiempo, se utilizará la hora en que se llamar a inicio().

+0

Gracias Marcos. Mi objetivo es crear un reloj digital que muestre la duración del tiempo entre dos actividades (almacenadas en la base de datos con registro de tiempo). ¿Podría aconsejarnos las mejores prácticas para esto? – Vitalliuss

+1

@Vitalliuss: si sus tiempos de inicio y fin están fijos en una base de datos, simplemente use 'TextView', ya que su valor no cambiará. Si su hora de inicio está fijada en una base de datos y está contando desde allí, necesitará crear su propio equivalente de 'Cronómetro' que tome una hora de inicio en la base de tiempo 'System.currentTimeMillis() ', en lugar de' elapsedRealtime() '. Dado que ['Chronometer' no es una clase muy larga] (https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/Chronometer.java), clonarlo y hacer uno propio debe ser razonablemente fácil. – CommonsWare

+0

Intentaré reescribir el cronómetro para mi proyecto. ¡Muchas gracias! – Vitalliuss

19

De hecho, tuve un problema similar (la fecha venía de un servicio externo, no de la base de datos) y quería mostrar la antigüedad de la fecha.

Se demostró que es simple:

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

Este es un enfoque mucho más razonable que reescribir 'Cronómetro' para aceptar una' Fecha' y responde la pregunta mejor que la respuesta aceptada actual. –

+0

¡Impresionante! Mucho mejor que la respuesta aceptada. – MidasLefko

+0

Esta no es una buena idea, ya que el usuario podría cambiar la fecha de su dispositivo. Entonces, ¿cómo sincronizar una fecha real del servidor sin usar el tiempo base del sistema? –

Cuestiones relacionadas