2012-06-02 2 views
7

Ich habe ein Problem mit dem Starten des Chronometers von der bestimmten Zeit. Es ist ein Date-Objekt ich meinen Chronometer Start will aus:Wie wird die Android Chronometer-Basiszeit vom Date-Objekt eingestellt?

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() +"]"); 

Ausgang:

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] 

Eigentlich, warum diese langen Zeitwert, differiert (11.624.388 und 1338644123032)?

Wenn ich meine Chronometer von der Basis beginnen

chronometer.setBase(SystemClock.elapsedRealtime()); 

- es funktioniert immer in Ordnung („00:00“ Tendenz steigend)

Aber wenn ich versuche, das Datum aus einem vergangenen Datum einzustellen (fe gestern):

chronometer.setBase(yesterday.getTime()); 

- es zeigt "00: 0 (" und ändert sich jede Sekunde die neueste char ")", "*", "/" und andere

Können Sie mir bitte mitteilen, wie ich die Chronometerbasis auf ein Date-Objekt einstellen kann?

Antwort

3

Eigentlich, warum diese langen Werte der Zeit unterscheidet (11624388 und 1338644123032)?

SystemClock.elapsedRealtime() ist die Anzahl der Millisekunden seit dem Einschalten des Geräts. Die anderen Werte basieren auf System.currentTimeMillis(), der Anzahl der Millisekunden seit der Unix-Epoche.

Könnten Sie bitte beraten, wie kann ich die Chronometerbasis auf ein Date-Objekt einstellen?

Sie nicht. Das ist nicht, was Chronometer ist für. Zitiert the documentation for Chronometer:

Sie können es geben eine Startzeit in der elapsedRealtime() Zeitbasis, und es zählt von dem, oder wenn Sie es nicht eine Basis Zeit geben, es wird die Zeit nutzen, in dem Sie Anruf starten().

+0

Dank Mark. Mein Ziel ist es, eine digitale Uhr zu erstellen, die die Zeitdauer zwischen zwei Aktivitäten anzeigt (gespeichert in der Datenbank mit der Zeitaufzeichnung). Könnten Sie bitte die beste Vorgehensweise dafür empfehlen? – Vitalliuss

+1

@Vitalliuss: Wenn Ihre Start- und Endzeiten in einer Datenbank festgelegt sind, verwenden Sie einfach 'TextView', da sich Ihr Wert nicht ändert. Wenn Ihre Startzeit in einer Datenbank festgelegt ist und Sie von dort aus zählen, müssen Sie ein eigenes 'Chronometer'-Äquivalent erstellen, das eine Startzeit in der' System.currentTimeMillis() 'Zeitbasis anstelle von' elapsedRealtime() 'benötigt. '. Da ['Chronometer' keine sehr lange Klasse ist] (https://github.com/android/platform_frameworks_base/blob/master/core/java/android/widget/Chronometer.java), sollte das Klonen und Erstellen eines eigenen sein ziemlich einfach. – CommonsWare

+0

Wird versuchen, Chronometer für mein Projekt neu zu schreiben. Danke vielmals! – Vitalliuss

19

Ich hatte eigentlich ein ähnliches Problem (das Datum kam von einem externen Dienst, nicht die Datenbank) und ich wollte zeigen, wie alt das Datum war.

Es erwies sich als einfach sein:

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

Dies ist ein viel vernünftigerer Ansatz als das Umschreiben von "Chronometer", um ein "Date" zu akzeptieren und die Frage besser zu beantworten als die aktuell akzeptierte Antwort. –

+0

Super! So viel besser als angenommene Antwort. – MidasLefko

+0

Dies ist keine gute Idee, da der Benutzer das Datum von Ihrem Gerät ändern könnte. Wie sincronisierst du eine echte Datumzeit vom Server, ohne die Systembasis zu verwenden? –

Verwandte Themen