2017-01-26 7 views
11

पर WEEK_OF_YEAR को प्रभावित नहीं कर रहा है नीचे दिया गया कोड नौगेट और प्री-नौगेट पर एक अलग परिणाम देता है। एक नज़र डालें और यदि आप चाहें तो इसे स्वयं आज़माएं। अगर कोई मुझे समझा सकता है और समाधान दे तो मैं इसकी सराहना करता हूं।ग्रेगोरियन कैलेंडर सेट फर्स्टडेऑफवेक पूर्व Nougat

मैं सभी एंड्रॉइड संस्करणों पर सप्ताह के पहले दिन पर निर्भर, सही WEEK_OF_YEAR मान चाहता हूं। मेरे पास टाइम शीट ऐप है और मैं ग्रेगोरियन कैलेंडर का बहुत उपयोग कर रहा हूं, इसलिए मुझे किसी अन्य वर्ग/lib पर स्विच करने की तरह महसूस नहीं होता है।

//default first day of the week is Monday for replication. I live in the Netherlands, it's weird. 
    Locale l = new Locale("nl", "NL"); 

    GregorianCalendar test = new GregorianCalendar(l); 
    test.set(Calendar.YEAR, 2017); 
    test.set(Calendar.MONTH, 0); 
    test.set(Calendar.DAY_OF_MONTH, 29);//this is a Sunday 

    int week = test.get(Calendar.WEEK_OF_YEAR);//should be 4 
    test.setFirstDayOfWeek(1);//Set it to Sunday 
    int week2 = test.get(Calendar.WEEK_OF_YEAR);//should be 5 but is 4 below nougat??? 
+0

स्पष्टीकरण के लिए धन्यवाद। मुझे नहीं लगता कि मेरा जवाब अब आपके लिए उपयोगी होगा क्योंकि समस्या की दिशा में सामान्य नोड के अलावा (नौगेट मिलान करने वाला ऐप और सिस्टम लोकेल)। बेहतर उत्तरों को आकर्षित करने के लिए, शायद आप कुछ और स्पष्ट कर सकते हैं। बस समस्या को दोहराने के लिए अपने नमूना कोड में लोकेल सेट कर रहा है या क्या आप अपने ऐप के अंदर कुछ करना चाहते हैं? –

+0

वैसे भी धन्यवाद। लोकेल बस समस्या को दोहराने के लिए है। –

उत्तर

3

आप release notes for Nougat को देखें, तो आप देख सकते हैं कि वहाँ स्थानों के लिए समर्थन बढ़ जाता है।

विशेष रूप से,

एंड्रॉयड 7.0 करने से पहले, एंड्रॉयड हमेशा एप्लिकेशन को सफलतापूर्वक और सिस्टम स्थानों से मेल खा सकते।

मैंने भी इसे अपने डिवाइस पर देखा है। मेरा फोन अंग्रेजी (ऑस्ट्रेलिया) लोकेल के साथ सेट है। नूगा करने से पहले,

DateTimeFormat.forPattern("dd MMMM").print(new LocalDate(2017,1,29)); 

29 Jan (कोई पूर्ण रोक/अवधि) मुद्रित होगा, लेकिन नूगा के बाद यह 29 Jan. प्रिंट (अवधि) के साथ।

हालांकि मेरे लिए सटीक विनिर्देश देना मुश्किल है, ऐसा लगता है कि यह आपके मामले में क्या हो रहा है। पोस्ट-नौगेट, फोन आपके लोकेल के लिए सप्ताह के पहले दिन सहित ऐप और सिस्टम लोकेशंस से बेहतर मिलान करने में सक्षम है। किसी भी मामले में, रूट कारण खोजने के लिए डीबगर के साथ कदम उठाने से काम नहीं होगा क्योंकि कॉल को स्रोत कोड में प्रकट जावा क्लास के बजाए libcore के अंदर संभाला जाता है।

एक Android डिवाइस गलत रूप से वर्ष के पहले दिन इस वर्ष के/प्रथम सप्ताह रिपोर्ट कर रहा है, तो वहाँ थोड़ा आप इसे चारों ओर कार्य के अलावा क्या कर सकते हैं होगा:

if (android.os.Build.VERSION.SDK_INT < 24) { 
    //pre-Nougat logic 
} 
else { 
    //Nougat/post-Nougat logic 
} 

तुम भी शायद enhanced replacement for GregorianCalendar उपयोग करने का प्रयास कर सकता है (आपकी समस्या को ठीक करने के लिए एसडीके 24 में जोड़ा गया)।

यदि आप Joda-time जैसे वर्गों का उपयोग करते हैं या नए JSR-310 कक्षाओं (थ्रीटेन बैकपोर्ट के माध्यम से) का उपयोग करते हैं तो आप GregorianCalendar के आसपास काम करने के बिना जो भी चाहते हैं उसे पाने में सक्षम हो सकते हैं। आम तौर पर इन वर्गों का उपयोग करना बहुत आसान होता है और कम बग-प्रवण होता है। इस तरह के मुद्दों के कारण कई डेवलपर्स पहले ही java.util.Calendar और java.util.Date पर छोड़ चुके हैं। कृपया विवरण के

आप Joda उपयोग करने के लिए थे, तो आप LocalDate.fromCalendarFields(test) उपयोग कर सकते हैं एक LocalDate में अपने GregorianCalendar वस्तु कन्वर्ट करने के लिए उत्तर to this canonical question देखते हैं। ये कक्षाएं आईएसओ मानक का उपयोग करती हैं जहां सप्ताह का पहला दिन हमेशा सोमवार होता है। फिर आप उन तर्कों को लिखेंगे जिन्हें आप चाहते हैं। फिर GregorianCalendar के साथ समस्या किसी दिए गए लोकेल के लिए वर्ष के पहले सप्ताह को पुनः प्राप्त करने के साथ ही एकमात्र समस्या में "पृथक" होगी। यदि आपका ऐप किसी सर्वर पर कॉल शामिल करता है, तो आप इसके बजाय एपीआई कॉल से सप्ताह के पहले दिन की सेवा कर सकते हैं।

अद्यतन:

नोट समय क्षेत्र व्यवहार Android O में अद्यतन किया गया है:

समय क्षेत्र नाम की पार्सिंग बदल गया है: इस प्रकार

अतिरिक्त स्थान और अंतर्राष्ट्रीयकरण से संबंधित बदलता है। पहले, एंड्रॉइड डिवाइस ने बूट समय पर नमूना सिस्टम घड़ी मान का उपयोग किया था ताकि समय क्षेत्र को पार्स करने के लिए उपयोग किए जाने वाले समय क्षेत्र नामों को कैश किया जा सके। नतीजतन, बूट समय पर या अन्य में दुर्लभ मामलों में सिस्टम घड़ी गलत होने पर पार्सिंग को नकारात्मक रूप से प्रभावित किया जा सकता है। अब, सामान्य मामलों में पार्सिंग तर्क समय क्षेत्र नामों को पार्स करते समय आईसीयू और वर्तमान सिस्टम घड़ी मान का उपयोग करता है। यह परिवर्तन अधिक सही परिणाम प्रदान करता है, जो आपके एंड्रॉइड संस्करणों से अलग हो सकता है जब आपका ऐप SimpleDateFormat जैसे वर्गों का उपयोग करता है। एंड्रॉइड ओ संस्करण 58 के लिए आईसीयू के संस्करण को अपडेट करता है।

+0

असल में मैं सही WEEK_OF_YEAR मान चाहता हूं, सप्ताह के पहले दिन, सभी एंड्रॉइड संस्करणों पर निर्भर करता हूं। मेरे पास टाइमशिप ऐप है और मैं ग्रेगोरियन कैलेंडर का बहुत उपयोग कर रहा हूं, इसलिए मुझे किसी अन्य वर्ग/lib पर स्विच करने की तरह महसूस नहीं होता है। –

-1

मुझे लगता है कि यह समस्या उस रेखा में है जहां आप महीने की स्थापना कर रहे हैं।

// यहां महीने में पैरामीटर आप उस मान के रूप में 0 गुजर रहे हैं जो समस्या पैदा कर सकता है क्योंकि भले ही सरणी 0 से शुरू होती है इनपुट। यह कैलेंडर 1 से 12 के बीच है। तो इसे बदलने का प्रयास करें ।

या तुम भी जनवरी तक यह महीने के उपयोग के रूप में स्थापित करने के लिए यह करने के लिए इसे बदल सकते हैं

test.set(Calendar.MONTH, Calendar.JANUARY); 

// इसके अलावा इस पंक्ति में यहाँ कोशिश करते हैं और

test.setFirstDayOfWeek(Calendar.SUNDAY);//Set it to Sunday 

को बदलने के इस का समाधान करना चाहिए अपने मुसीबत।

+1

मुझे खेद है दोस्त, यह सच नहीं है। 'कैलेंडर.जैनरी 'का मान भी 0. –

+0

कैलेंडर का उपयोग करने का एकमात्र कारण है। जनवरी यह है कि यदि मान लीजिए कि जनवरी से बदलकर 0 से कुछ अन्य मूल्यों में परिवर्तन होता है तो अपडेट होने के लिए आपके कोड की आवश्यकता नहीं होगी। –

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