2012-06-02 11 views
7

मुझे विशिष्ट समय से क्रोनोमीटर शुरू करने के साथ कोई समस्या है। एक दिनांक वस्तु मैंने अपने ठीक घड़ी शुरू चाहते है:डेट ऑब्जेक्ट से एंड्रॉइड क्रोनोमीटर बेस टाइम कैसे सेट करें?

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 (11,624,388 और 1338644123032) की इस लंबी मूल्यों?

जब मैं आधार

chronometer.setBase(SystemClock.elapsedRealtime()); 

से मेरे ठीक घड़ी शुरू - यह हमेशा ठीक काम करता है ("00:00" और बढ़ती)

लेकिन जब मैं (फ़े एक अतीत की तारीख से तारीख तय करने की कोशिश कल):

chronometer.setBase(yesterday.getTime()); 

- यह बताती है "00: 0 (" और हर दूसरे नवीनतम चार करने के लिए ")" बदलता है, "*", "/" और दूसरों

क्या आप कृपया सलाह दे सकते हैं कि मैं क्रोनोमीटर बेस को डेट ऑब्जेक्ट में कैसे सेट कर सकता हूं?

उत्तर

3

वास्तव में, समय के इस लंबे मूल्य क्यों भिन्न होते हैं (11624388 और 1338644123032)?

SystemClock.elapsedRealtime() डिवाइस चालू होने के बाद मिलीसेकंड की संख्या है। अन्य मान यूनिक्स युग के बाद मिलीसेकंड की संख्या System.currentTimeMillis() से आधारित हैं।

क्या आप कृपया सलाह दे सकते हैं कि मैं क्रोनोमीटर बेस को डेट ऑब्जेक्ट में कैसे सेट कर सकता हूं?

आप नहीं करते हैं। यह नहीं है कि Chronometer के लिए है। the documentation for Chronometer का हवाला देते हुए:

आप इसे एक प्रारंभ समय elapsedRealtime में() timebase दे सकते हैं, और यह है कि से गिना जाता है, या यदि आप इसे एक आधार समय देना नहीं है, यह समय का उपयोग करेगा, जिस पर आप कॉल शुरू करें()।

+0

धन्यवाद मार्क। मेरा लक्ष्य डिजिटल घड़ी बनाना है जो दो गतिविधियों (समय रिकॉर्ड के साथ डेटाबेस में संग्रहीत) के बीच समय अवधि दिखाता है। क्या आप इसके लिए सबसे अच्छा अभ्यास सलाह दे सकते हैं? – Vitalliuss

+1

@ विटालियस: यदि आपके प्रारंभ और समाप्ति समय दोनों डेटाबेस में तय किए गए हैं, तो बस 'टेक्स्ट व्यू' का उपयोग करें, क्योंकि आपका मान बदल नहीं जाएगा। यदि आपका प्रारंभ समय डेटाबेस में तय किया गया है, और आप वहां से गिन रहे हैं, तो आपको अपना 'क्रोनोमीटर' समकक्ष बनाना होगा जो 'system.currentTimeMillis()' टाइमबेस में प्रारंभ समय लेता है, बजाय 'elapsedRealtime() '। चूंकि ['क्रोनोमीटर 'एक बहुत लंबी कक्षा नहीं है] (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

'दिनांक' स्वीकार करने के लिए 'क्रोनोमीटर' को फिर से लिखने से पहले यह एक और अधिक उचित दृष्टिकोण है और मौजूदा स्वीकृत उत्तर से बेहतर प्रश्न का उत्तर देता है। –

+0

बहुत बढ़िया! स्वीकार्य उत्तर से बहुत बेहतर है। – MidasLefko

+0

यह एक अच्छी विचारधारा नहीं है, क्योंकि उपयोगकर्ता आपके डिवाइस से तारीख बदल सकता है। तो आप सिस्टम बेस टाइम का उपयोग किए बिना सर्वर से वास्तविक दिनांक समय को कैसे sincronize? –

संबंधित मुद्दे