महीने की गणना का अंतिम दिन


144

मैं इस बात की गणना कर रहा हूं कि अगले महीने का आखिरी दिन अधिसूचना के लिए कब भेजा जाएगा।

यहाँ मेरा कोड है:

RecurrenceFrequency recurrenceFrequency = notification.getRecurrenceFrequency();
Calendar nextNotifTime = Calendar.getInstance();

यह वह रेखा है जिसके कारण मुझे विश्वास है:

nextNotifTime.add(recurrenceFrequency.getRecurrencePeriod(), 
                  recurrenceFrequency.getRecurrenceOffset());

मैं अधिसूचना के लिए अगले महीने के अंतिम दिन को ठीक से निर्धारित करने के लिए कैलेंडर का उपयोग कैसे कर सकता हूं?


1
इसे अगले महीने के पहले दिन पर सेट करें और फिर एक दिन वापस रोल करें।
बिल

एक SSCCE इस प्रश्न का उत्तर देना आसान बना देगा। आप वास्तव में क्या समस्या देख रहे हैं?
डीएनए

जवाबों:


347
Calendar.getInstance().getActualMaximum(Calendar.DAY_OF_MONTH);

यह चालू माह के लिए वास्तविक अधिकतम रिटर्न देता है। उदाहरण के लिए यह अब लीप वर्ष का फरवरी है, इसलिए यह 29 के रूप में वापस आता है int


धन्यवाद, मुझे अगले महीने के लिए अधिकतम प्राप्त करने की आवश्यकता है, हालांकि, यह अभी भी काम करना है कि यह महीने का पहला दिन भी हो सकता है, क्योंकि यह हिस्सा अब काम करता है। अपना समय और प्रयास के लिए फिर से धन्यवाद
OakvilleWork

4
यह ActualMaximumहर तारीख के लिए एक समस्या नहीं है । कॉल करने से पहले आवश्यक तिथि के लिए कैलेंडर उदाहरण को रोल करें getActualMaximum। पहली तिथिgetActualMinimum()
एलेक्स

ठीक है बहुत बहुत धन्यवाद एलेक्स, इसलिए अगर मैं एक महीने आगे उदाहरण को रोल करना चाहता हूं और उस महीने के लिए getActualMaximum का पता लगाऊं तो मैं ऐसा कैसे करूंगा ?? चीयर्स
ओकविलेवर्क

क्या यह एलेक्स होगा? nextNotifTime.roll (Calendar.MONTH, true); nextNotifTime.getActualMaximum (Calendar.DAY_OF_MONTH);
ओकविलेवर्क

इसके बाद भी मैंने तैयार होने का समय निर्धारित किया: nextNotification.setReadyDateTime(nextNotifTime.getTime()); इसलिए क्या मुझे इसके बजाय ऐसा नहीं करना चाहिए nextNotifTime.roll(Calendar.MONTH, true); nextNotifTime.getActualMaximum(Calendar.DAY_OF_MONTH); nextNotifTime.setTime(Calendar.DAY_OF_MONTH); :?
ओक्विलेवर्क

61

java.time.temporal.TemporalAdjusters.lastDayOfMonth ()

java.timeजावा 8 में निर्मित लाइब्रेरी का उपयोग करके , आप TemporalAdjusterइंटरफ़ेस का उपयोग कर सकते हैं । हम TemporalAdjustersउपयोगिता वर्ग में उपयोग के लिए तैयार कार्यान्वयन पाते हैं lastDayOfMonth:।

import java.time.LocalDate;
import java.time.temporal.TemporalAdjusters;

LocalDate now = LocalDate.now(); //2015-11-23
LocalDate lastDay = now.with(TemporalAdjusters.lastDayOfMonth()); //2015-11-30

आप समय की जानकारी जोड़ने की जरूरत है, तो आप किसी भी उपलब्ध का उपयोग कर सकते LocalDateकरने के लिए LocalDateTimeकी तरह रूपांतरण

lastDay.atStartOfDay(); //2015-11-30T00:00

अच्छा उत्तर। लेकिन वह अंतिम भाग कमजोर है, के उपयोग का सुझाव है LocalDateTime। उस वर्ग में समय क्षेत्र या ऑफ़सेट-यूटीसी की किसी भी अवधारणा का अभाव है। इसलिए यह निर्धारित नहीं किया जा सकता है कि किसी विशेष स्थान पर एक विशेष दिन वास्तव में कब शुरू होता है। वह वर्ग केवल सादा सामान्य 24-घंटे के दिनों के लिए काम करता है, वास्तविक-वास्तविक दिनों के लिए नहीं। वास्तविक दिनों के लिए, एक समय क्षेत्र निर्दिष्ट करें ZonedDateTime zdt = now.atStartOfDay( ZoneId.of( "Asia/Tokyo" ) ) ;:। कुछ स्थानों पर कुछ दिन अलग समय पर शुरू हो सकते हैं, जैसे कि 01:00, क्योंकि डेलाइट सेविंग टाइम (DST) जैसी विसंगतियाँ।
बेसिल बॉर्क

35

और दिनांक वस्तु के रूप में अंतिम दिन प्राप्त करने के लिए:

Calendar cal = Calendar.getInstance();
cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE));

Date lastDayOfMonth = cal.getTime();

22

आप कैलेंडर को अगले महीने के पहले में सेट कर सकते हैं और फिर एक दिन घटा सकते हैं।

Calendar nextNotifTime = Calendar.getInstance();
nextNotifTime.add(Calendar.MONTH, 1);
nextNotifTime.set(Calendar.DATE, 1);
nextNotifTime.add(Calendar.DATE, -1);

इस कोड को चलाने के बाद nextNotifTime चालू माह के अंतिम दिन पर सेट हो जाएगा। ध्यान रखें यदि आज महीने का आखिरी दिन है तो इस कोड का शुद्ध प्रभाव यह है कि कैलेंडर ऑब्जेक्ट अपरिवर्तित रहता है।


17

निम्नलिखित हमेशा उचित परिणाम देंगे:

    Calendar cal = Calendar.getInstance();
    cal.set(Calendar.MONTH, ANY_MONTH);
    cal.set(Calendar.YEAR, ANY_YEAR);
    cal.set(Calendar.DAY_OF_MONTH, 1);// This is necessary to get proper results
    cal.set(Calendar.DATE, cal.getActualMaximum(Calendar.DATE));
    cal.getTime();

क्यों जरूरी है? क्या आप मुझे बता सकते हैं :)
फ्रैंक फेंग

1
हां, इस सटीक कारण के लिए सिर्फ परीक्षण विफल रहे थे। समस्या यह है कि जब तक DAY_OF_MONTH सेट नहीं किया जाता है, तब तक यह वर्तमान में डिफ़ॉल्ट होगा।
पप्पीसी

7

java.timeयहाँ नवीनतम पुस्तकालय का उपयोग करना सबसे अच्छा समाधान है:

LocalDate date = LocalDate.now();
LocalDate endOfMonth = date.with(TemporalAdjusters.lastDayOfMonth());

वैकल्पिक रूप से, आप कर सकते हैं:

LocalDate endOfMonth = date.withDayOfMonth(date.lengthOfMonth());


2

getActualMaximum(int field)कैलेंडर ऑब्जेक्ट की विधि देखें।

यदि आप अपने कैलेंडर ऑब्जेक्ट को उस महीने में सेट करते हैं जिसके लिए आप अंतिम तिथि मांग रहे हैं, तो getActualMaximum(Calendar.DAY_OF_MONTH)आपको अंतिम दिन देगा।


2
        SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
        Date date = sdf.parse("11/02/2016");

        Calendar calendar = Calendar.getInstance();  
        calendar.setTime(date);  

        System.out.println("First Day Of Month : " + calendar.getActualMinimum(Calendar.DAY_OF_MONTH));  
        System.out.println("Last Day of Month  : " + calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); 

1

उपयोग करते हुए कोटलिन तिथि विस्तार कार्यान्वयन java.util.Calendar

fun Date.toEndOfMonth(): Date {
    return Calendar.getInstance().apply {
        time = this@toEndOfMonth
    }.toEndOfMonth().time
}

fun Calendar.toEndOfMonth(): Calendar {
    set(Calendar.DAY_OF_MONTH, getActualMaximum(Calendar.DAY_OF_MONTH))
    return this
}

आप toEndOfMonthप्रत्येक दिनांक ऑब्जेक्ट जैसे फ़ंक्शन को कॉल कर सकते हैंDate().toEndOfMonth()


4
जेएसआर 310 को अपनाने के साथ आधुनिक java.time कक्षाओं द्वारा इन भयानक वर्गों को वर्षों पहले दबा दिया गया था । 2019 में इन विरासत वर्गों का सुझाव देना खराब सलाह है।
तुलसी बॉर्क

यह बुरी सलाह नहीं है। आधुनिक java.time केवल एपीआई 26+ के लिए Android के लिए उपलब्ध है। हम अभी भी java.util पर निर्भर हैं । * पुराने उपकरणों का समर्थन करते समय (ऐसा नहीं)।
राफेल चगास
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.