2012-06-02 6 views
7

Ho riscontrato un problema con l'avvio del cronometro dall'ora specifica. C'è un oggetto Date voglio che il mio inizio di cronometro da:Come impostare l'ora di base Android Chronometer dall'oggetto 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() +"]"); 

uscita:

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] 

In realtà, perché questo lungo valori di differes tempo (11624388 e 1.338.644,123032 millions)?

Quando avvio il mio cronometro dalla base

chronometer.setBase(SystemClock.elapsedRealtime()); 

- funziona sempre bene ("00:00" e in aumento)

Ma quando provo a impostare la data da un passato Data (fe ieri):

chronometer.setBase(yesterday.getTime()); 

- mostra "00: 0 (" e cambia ogni secondo l'ultimo char ")", "*", "/" e altri

Potresti consigliare come posso impostare la base del cronometro su un oggetto Date?

risposta

3

In realtà, perché questo lungo intervallo di tempo è diverso (11624388 e 1338644123032)?

SystemClock.elapsedRealtime() è il numero di millisecondi dall'accensione del dispositivo. Gli altri valori si basano su System.currentTimeMillis(), il numero di millisecondi dall'epoca Unix.

Potrebbe consigliare come è possibile impostare la base del cronometro su un oggetto Data?

Non è così. Questo non è quello che è Chronometer. Citando the documentation for Chronometer:

si può dare un orario di inizio nel elapsedRealtime() base dei tempi, e conta fino a quello, o se non si dà un tempo di base, verrà utilizzato il momento in cui si chiamata start().

+0

Grazie Marco. Il mio obiettivo è creare un orologio digitale che mostri la durata tra due attività (memorizzate nel database con record di tempo). Potresti consigliare la migliore pratica per questo? – Vitalliuss

+1

@Vitalliuss: se il tempo di inizio e quello di fine sono fissi in un database, usa solo 'TextView', poiché il tuo valore non cambierà. Se il tuo orario di inizio è fisso in un database, e stai contando da lì, dovrai creare il tuo equivalente 'Cronometro' che richiede un tempo di inizio nella base dei tempi' System.currentTimeMillis() ', invece di' elapsedRealtime() '. Poiché ['Chronometer' non è una classe molto lunga] (https://github.com/android/platform_framework_base/blob/master/core/java/android/widget/Chronometer.java), clonandolo e creando il tuo dovrebbe essere ragionevolmente facile – CommonsWare

+0

Proverò a riscrivere Chronometer per il mio progetto. Grazie molto! – Vitalliuss

19

In realtà avevo un problema simile (la data proveniva da un servizio esterno, non dal database) e volevo mostrare quanti anni aveva la data.

Essa ha dimostrato di essere semplice:

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

Questo è un approccio molto più ragionevole della riscrittura di 'Cronometro' per accettare una' Data' e risponde alla domanda meglio della risposta corrente accettata. –

+0

Fantastico! Molto meglio della risposta accettata. – MidasLefko

+0

Questa non è una buona idea, dal momento che l'utente può cambiare la data dal tuo dispositivo. Quindi, come sincronizzare una data reale dal server senza utilizzare il tempo di base del sistema? –