android - सैमसंग जे 7 सप्ताह के पहले दिन 2 के रूप में लौट रहा है




calendar (3)

मैंने कस्टम कैलेंडर के लिए एक कोड लिखा है, जहां मैं कैलेंडर ऑब्जेक्ट का उपयोग कर रहा हूं। मैंने हर महीने के पहले दिन को पुनः प्राप्त करने के लिए विधि का उपयोग किया है। हर महीने लोड करने पर "_calendar.getTime ()" विधि पहली तारीख देता है। हर डिवाइस पर यह सही तरीके से वापस आ रहा है। लेकिन सैमसंग जे 7 पर यह सप्ताह की शुरुआत तिथि 2 के रूप में देता है सैमसंग जे 7 के लिए यहां मेरा डिबगर लॉग है I

java.util.GregorianCalendar [समय = ?, areFieldsSet = false, उदार = सच है, क्षेत्र = एशिया / कोलकाता, firstDayOfWeek = 2, minimalDaysInFirstWeek = 4, युग = 1, वर्ष = 2016 माह = 10 से WEEK_OF_YEAR = 41, WEEK_OF_MONTH = 3, DAY_OF_MONTH = 14, DAY_OF_YEAR = 288, DAY_OF_WEEK = 6, DAY_OF_WEEK_IN_MONTH = 2, AM_PM = 1, इस घंटे = 3, HOUR_OF_DAY = 15, मिनट = 46, सेकंड = 58, मिलीसेकंड = 199, ZONE_OFFSET = 19,800,000, DST_OFFSET = 0]

यह सबसे पहले बताता है कि डिवाइस के बाकी हिस्सों के लिए डेऑफ़ वाईक = 2, यह 1 के रूप में दिखाता है। तो समाधान के लिए कोई विचार? धन्यवाद।


Answers

tl; डॉ

  • आप पहले-महीने के पहले-हफ्ते के साथ पहले महीने का सामना करना चाहते हैं
  • 2 सोमवार का प्रतिनिधित्व एक कठिन कोडित निरंतर है
  • जाहिर है आपका वर्तमान डिफ़ॉल्ट स्थान सोमवार को सप्ताह के पहले दिन होने का अनुमान लगाता है।
  • इसके बजाय java.time का उपयोग करें।

सप्ताह के पहले दिन के लिए:

LocalDate.now( ZoneId.of( "America/Montreal" ) )
         .with( TemporalAdjusters.previousOrSame( DayOfWeek.MONDAY ) ) 

महीने के पहले दिन के लिए:

LocalDate.now( ZoneId.of( "Pacific/Auckland" ) )
         .with( ChronoField.DAY_OF_MONTH , 1L )

विवरण

प्रत्येक महीने के पहले दिन को प्राप्त करने के लिए GetFirstDayOfWeek () प्राप्त करें

आप पहले महीने के साथ पहले सप्ताह में भ्रमित होने लगते हैं।

महीने का पहला कोर्स हमेशा 1 होता है।

सप्ताह का पहला दिन रविवार का दिन है जैसे रविवार या सोमवार आदि। Calendar वर्ग में सप्ताह के पहले दिन की परिभाषा बदलती है, Locale आधार पर। उदाहरण के लिए, उत्तरी अमेरिका के ज्यादातर हिस्सों में, पहले दिन रविवार को सामान्य रूप से होता है अधिकतर यूरोप में, सप्ताह का पहला दिन सोमवार है।

यदि आप एक Locale निर्दिष्ट करने में विफल हैं, तो Calendar वर्ग इन्क्वायसर JVM के वर्तमान डिफ़ॉल्ट लोकेल पर लागू होता है जाहिरा तौर पर आपके डिफ़ॉल्ट लोकेल में सप्ताह का पहला दिन सोमवार है। मैं इसका कारण निकालता हूं क्योंकि आप संख्या 2 रिपोर्ट करते हैं यदि आप int निरंतर Calendar.MONDAY पता लगाते हैं। int , आप पाते हैं कि यह वास्तव में मूल्य 2 का एक प्रारंभिक int है

लीगेसी डेट-टाइम क्लासेस से बचें

Calendar वर्ग में कई खराब डिज़ाइन फैसले हैं मैं उनमें से एक होने के लिए सप्ताह के दिन की इस अलग परिभाषा पर विचार करता हूं। Calendar और Date जैसी पुरानी तिथि-समय की कक्षाओं से बचने के कई कारणों में से एक ये कक्षाएं अब लीगेसी हैं, जो जावा टाइम टाइम क्लास द्वारा दी गई हैं।

Java.time का उपयोग करना

LocalDate क्लास टाइम-ऑफ-दिवस के बिना और टाइम ज़ोन के बिना केवल-डेट मान का प्रतिनिधित्व करता है।

दिनांक निर्धारित करने में समय क्षेत्र महत्वपूर्ण है किसी भी क्षण के लिए, ज़ोन द्वारा विश्वभर की तारीख भिन्न होती है। उदाहरण के लिए, पेरिस में मध्यरात्रि के कुछ मिनट बाद फ्रांस एक नया दिन है, जबकि मॉन्ट्रियल क्यूबेक में "कल"

continent/region के स्वरूप में उचित समय क्षेत्र नाम निर्दिष्ट करें, जैसे America/Montreal , Africa/Casablanca , या Pacific/Auckland । कभी भी EST या IST जैसे 3-4 पत्र संक्षिप्त नाम का उपयोग न करें क्योंकि वे सही समय क्षेत्र नहीं हैं, मानकीकृत नहीं हैं, और यहां तक ​​कि अनूठे (!) भी नहीं हैं।

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

सप्ताह के पहले दिन प्राप्त करने के लिए, (ए) तय करें कि आपके लिए सप्ताह का पहला दिन क्या है, (बी) DayOfWeek में परिभाषित TemporalAdjuster कार्यान्वयन का उपयोग करके किसी विशिष्ट DayOfWeek ऑब्जेक्ट की तिथि प्राप्त करने के लिए।

DayOfWeek firstDow = DayOfWeek.MONDAY ;
LocalDate ld = today.with( TemporalAdjusters.previousOrSame( firstDow ) ) ;

महीने के एक निश्चित दिन के लिए एक LocalDate प्राप्त करने के लिए, विधि के with कॉल करें और ChronoField.DAY_OF_MONTH से एक enum ऑब्जेक्ट पास करें।

LocalDate firstOfMonth = today.with( ChronoField.DAY_OF_MONTH , 1L ) ;

जावा के बारे में। समय

Java.time फ्रेमवर्क जावा 8 और बाद में बनाया गया है। ये कक्षाएं परेशानी पुरानी विरासत तिथि-समय कक्षाएं जैसे कि java.util.Date , Calendar , और SimpleDateFormat

जोडा-टाइम प्रोजेक्ट, अब रखरखाव मोड में , जावा के समय की कक्षाओं के लिए प्रवासन की सलाह देते हैं।

अधिक जानने के लिए, ओरेकल ट्यूटोरियल देखें। और कई उदाहरणों और स्पष्टीकरण के लिए स्टैक अतिप्रवाह खोजें। विशिष्टता JSR 310 है

जावा को कब प्राप्त करें कक्षाएं?


ठीक है, मुझे समाधान मिला GetFirstDayOfWeek () का उपयोग करने के बजाय मैं पैरामीटर के रूप में 1 पास किया तो यह ठीक से काम कर रहा है

 _calendar.set(year, (month - 1), 1);

की जगह में

_calendar.set(year, (month - 1), _calendar.getFirstDayOfWeek());

घटनाओं और अनुस्मारक जोड़ने के लिए एंड्रॉइड पूर्ण स्रोत कोड।

/** Adds Events and Reminders in Calendar. */
private void addReminderInCalendar() {
    Calendar cal = Calendar.getInstance();
    Uri EVENTS_URI = Uri.parse(getCalendarUriBase(true) + "events");
    ContentResolver cr = getContentResolver();
    TimeZone timeZone = TimeZone.getDefault();

    /** Inserting an event in calendar. */
    ContentValues values = new ContentValues();
    values.put(CalendarContract.Events.CALENDAR_ID, 1);
    values.put(CalendarContract.Events.TITLE, "Sanjeev Reminder 01");
    values.put(CalendarContract.Events.DESCRIPTION, "A test Reminder.");
    values.put(CalendarContract.Events.ALL_DAY, 0);
    // event starts at 11 minutes from now
    values.put(CalendarContract.Events.DTSTART, cal.getTimeInMillis() + 1 * 60 * 1000);
    // ends 60 minutes from now
    values.put(CalendarContract.Events.DTEND, cal.getTimeInMillis() + 2 * 60 * 1000);
    values.put(CalendarContract.Events.EVENT_TIMEZONE, timeZone.getID());
    values.put(CalendarContract.Events.HAS_ALARM, 1);
    Uri event = cr.insert(EVENTS_URI, values);

    // Display event id.
    Toast.makeText(getApplicationContext(), "Event added :: ID :: " + event.getLastPathSegment(), Toast.LENGTH_SHORT).show();

    /** Adding reminder for event added. */
    Uri REMINDERS_URI = Uri.parse(getCalendarUriBase(true) + "reminders");
    values = new ContentValues();
    values.put(CalendarContract.Reminders.EVENT_ID, Long.parseLong(event.getLastPathSegment()));
    values.put(CalendarContract.Reminders.METHOD, Reminders.METHOD_ALERT);
    values.put(CalendarContract.Reminders.MINUTES, 10);
    cr.insert(REMINDERS_URI, values);
}

/** Returns Calendar Base URI, supports both new and old OS. */
private String getCalendarUriBase(boolean eventUri) {
    Uri calendarURI = null;
    try {
        if (android.os.Build.VERSION.SDK_INT <= 7) {
            calendarURI = (eventUri) ? Uri.parse("content://calendar/") : Uri.parse("content://calendar/calendars");
        } else {
            calendarURI = (eventUri) ? Uri.parse("content://com.android.calendar/") : Uri
                    .parse("content://com.android.calendar/calendars");
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
    return calendarURI.toString();
}

अपनी मैनिफेस्ट फ़ाइल में अनुमति जोड़ें।

<uses-permission android:name="android.permission.READ_CALENDAR" />
<uses-permission android:name="android.permission.WRITE_CALENDAR" />




android calendar