किसी विशेष वर्ष के विशेष महीने में कितने दिन?


158

कैसे जानें कि किसी विशेष वर्ष के कितने महीने हैं?

String date = "2010-01-19";
String[] ymd = date.split("-");
int year = Integer.parseInt(ymd[0]);
int month = Integer.parseInt(ymd[1]);
int day = Integer.parseInt(ymd[2]);
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR,year);
calendar.set(Calendar.MONTH,month);
int daysQty = calendar.getDaysNumber(); // Something like this

7
आपका सवाल क्या है?
शाममन-एच_फेल २०'१२ को ११:०_

FYI करें, इस तरह के रूप में बहुत परेशानी पुराने तिथि-समय कक्षाएं java.util.Date, java.util.Calendarऔर java.text.SimpleDateFormatअब कर रहे हैं विरासत , द्वारा का स्थान ले लिया java.time जावा 8 और बाद में बनाया गया वर्गों। ओरेकल द्वारा ट्यूटोरियल देखें ।
तुलसी Bourque

जवाबों:


368

जावा 8 और बाद में

@Warren एम। नोकोस। यदि आप जावा 8 की नई तिथि और समय एपीआई का उपयोग करने का प्रयास कर रहे हैं , तो आप java.time.YearMonthकक्षा का उपयोग कर सकते हैं । ओरेकल ट्यूटोरियल देखें ।

// Get the number of days in that month
YearMonth yearMonthObject = YearMonth.of(1999, 2);
int daysInMonth = yearMonthObject.lengthOfMonth(); //28  

टेस्ट: एक लीप वर्ष में एक महीने का प्रयास करें:

yearMonthObject = YearMonth.of(2000, 2);
daysInMonth = yearMonthObject.lengthOfMonth(); //29 

जावा 7 और उससे पहले

एक कैलेंडर बनाएं, वर्ष और माह निर्धारित करें और उपयोग करें getActualMaximum

int iYear = 1999;
int iMonth = Calendar.FEBRUARY; // 1 (months begin with 0)
int iDay = 1;

// Create a calendar object and set year and month
Calendar mycal = new GregorianCalendar(iYear, iMonth, iDay);

// Get the number of days in that month
int daysInMonth = mycal.getActualMaximum(Calendar.DAY_OF_MONTH); // 28

टेस्ट : एक लीप वर्ष में एक महीने का प्रयास करें:

mycal = new GregorianCalendar(2000, Calendar.FEBRUARY, 1);
daysInMonth= mycal.getActualMaximum(Calendar.DAY_OF_MONTH);      // 29

2
जावा 8 की नई तिथि और समय एपीआई पर यह कैसे करें?
वॉरेन एम। नोकोस

2
@ WarrenM.Nocos देर से प्रतिक्रिया के लिए खेद है, लेकिन मैं इन महीनों में सक्रिय नहीं था। कृपया जावा 8. के ​​लिए समाधान के लिए संपादित करें की जाँच करें।
हेमंत मेटलिया

जावा 8 से पहले के लिए ... जावा - टाइम की अधिकांश कार्यक्षमता थ्री-बैक-बैकपोर्ट परियोजना में जावा 6 और जावा 7 में वापस पोर्ट की गई है। इसके अलावा तीनटैनबप प्रोजेक्ट में पहले के एंड्रॉइड के लिए अनुकूलित । देखें कि थ्रीटेबैप का उपयोग कैसे करें…
तुलसी बॉर्क

43

Java.util.Calendar के लिए कोड

यदि आपको उपयोग करना है java.util.Calendar, तो मुझे संदेह है कि आप चाहते हैं:

int days = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

कोड कोड के लिए Joda Time

व्यक्तिगत रूप से, हालांकि, मैं सुझाव दूंगा कि आप जिस समय का java.util.{Calendar, Date}उपयोग कर सकते हैं, उसके बजाय जोडा टाइम का उपयोग करें:

int days = chronology.dayOfMonth().getMaximumValue(date);

ध्यान दें कि व्यक्तिगत रूप से स्ट्रिंग मानों को पार्स करने के बजाय, यह बेहतर होगा कि आप इसे पार्स करने के लिए जिस भी तारीख / समय एपीआई का उपयोग कर रहे हों। में java.util.*आप उपयोग कर सकते हैं SimpleDateFormat; Joda समय में आप एक का उपयोग करेंगे DateTimeFormatter


27

आप Calendar.getActualMaximumविधि का उपयोग कर सकते हैं :

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month);
int numDays = calendar.getActualMaximum(Calendar.DATE);


7
if (month == 4 || month == 6 || month == 9 || month == 11)

daysInMonth = 30;

else 

if (month == 2) 

daysInMonth = (leapYear) ? 29 : 28;

else 

daysInMonth = 31;

कैलेंडर c = Calendar.getInstance (); c.set (Calendar.DAY_OF_MONTH, c.getActualMaximum (Calendar.DAY_OF_MONTH)); // आप वास्तविक अधिकतम coz प्राप्त करने से पहले वर्ष निर्धारित कर सकते हैं वे समान नहीं हो सकते हैं। 2011 और 2012 का फेब समान लंबाई (लीप वर्ष) नहीं है
गुलाब

5

यह गणितीय तरीका है:

वर्ष के लिए, माह (1 से 12):

int daysInMonth = month == 2 ? 
    28 + (year % 4 == 0 ? 1:0) - (year % 100 == 0 ? (year % 400 == 0 ? 0 : 1) : 0) :
    31 - (month-1) % 7 % 2;

3

मैं इस तरह एक समाधान के लिए जाना होगा:

int monthNr = getMonth();
final Month monthEnum = Month.of(monthNr);
int daysInMonth;
if (monthNr == 2) {
    int year = getYear();
    final boolean leapYear = IsoChronology.INSTANCE.isLeapYear(year);
    daysInMonth = monthEnum.length(leapYear);
} else {
    daysInMonth = monthEnum.maxLength();
}

यदि माह फरवरी नहीं है (मामलों का 92%), यह केवल महीने पर निर्भर करता है और यह वर्ष को शामिल नहीं करने के लिए अधिक कुशल है। इस तरह, आपको यह जानने के लिए तर्क को कॉल करने की आवश्यकता नहीं है कि क्या यह एक लीप वर्ष है और आपको 92% मामलों में वर्ष प्राप्त करने की आवश्यकता नहीं है। और यह अभी भी साफ और बहुत पठनीय कोड है।


1
मैं पूरे तर्क को एक सिद्ध पुस्तकालय विधि में छोड़ना पसंद करूंगा - मुझे लगता है कि आप समय से पहले अनुकूलन कर रहे हैं, और पुस्तकालय के तरीके उस अक्षम नहीं हैं। अभी भी आधुनिक java.time के उपयोग के लिए उत्कीर्ण है।
ओले वीवी

@ OleV.V। सच है, कई मामलों में एक सिद्ध पुस्तकालय के लिए अनुकूलन को छोड़ना बेहतर हो सकता है। लेकिन, इस मामले में, मौजूदा पुस्तकालयों को एक महीने और वर्ष पारित करने की आवश्यकता होगी। तो इसका मतलब है कि मुझे उस वर्ष को प्राप्त करने के लिए जो कुछ भी करना है, वह करने की आवश्यकता है, भले ही विधि 92% मामलों में मूल्य का उपयोग नहीं करेगी। इसलिए, यह एक हिस्सा है जो यह मेरे लिए अनुकूलन नहीं कर सकता है। मेरा तर्क इस कारण के समान है कि आपको एक लॉगर को पारित करने के लिए एक मान प्राप्त करने के लिए एक विधि कॉल नहीं करना चाहिए जिसे अक्षम किया जा सकता है। कोई तरीका नहीं है कि लकड़हारा यह अनुकूलन कर सकता है।
स्टीफन मोंडेलेर्स

1

Java8 में आप किसी दिनांक के क्षेत्र से ValueRange प्राप्त कर सकते हैं।

LocalDateTime dateTime = LocalDateTime.now();

ChronoField chronoField = ChronoField.MONTH_OF_YEAR;
long max = dateTime.range(chronoField).getMaximum();

यह आपको फ़ील्ड पर पैरामीटर बनाने की अनुमति देता है।


1

उस के रूप में सरल, कुछ भी आयात करने की आवश्यकता नहीं है

public static int getMonthDays(int month, int year) {
    int daysInMonth ;
    if (month == 4 || month == 6 || month == 9 || month == 11) {
        daysInMonth = 30;
    }
    else {
        if (month == 2) {
            daysInMonth = (year % 4 == 0) ? 29 : 28;
        } else {
            daysInMonth = 31;
        }
    }
    return daysInMonth;
}

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

1
// 1 means Sunday ,2 means Monday .... 7 means Saturday
//month starts with 0 (January)

MonthDisplayHelper monthDisplayHelper = new MonthDisplayHelper(2019,4);
int numbeOfDaysInMonth = monthDisplayHelper.getNumberOfDaysInMonth();

1
यह ध्यान देने योग्य है कि यह एंड्रॉइड ( android.util.MonthDisplayHelper) के लिए है
बार्बसन

0
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

/*
 * 44. Return the number of days in a month
 * , where month and year are given as input.
 */
public class ex44 {
    public static void dateReturn(int m,int y)
    {
        int m1=m;
        int y1=y;
        String str=" "+ m1+"-"+y1;
        System.out.println(str);
        SimpleDateFormat sd=new SimpleDateFormat("MM-yyyy");

        try {
            Date d=sd.parse(str);
            System.out.println(d);
            Calendar c=Calendar.getInstance();
            c.setTime(d);
            System.out.println(c.getActualMaximum(Calendar.DAY_OF_MONTH));
        } catch (ParseException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }
    public static void main(String[] args) {
dateReturn(2,2012);


    }

}

1
यह उत्तर मौजूदा और स्वीकृत उत्तरों पर क्या मूल्य प्रदान करता है? इसके अलावा, कृपया अपने कोड के साथ कुछ स्पष्टीकरण या कथा जोड़ें। StackOverflow एक स्निपेट लाइब्रेरी से अधिक है।
बेसिल बोर्के

0
public class Main {

    private static LocalDate local=LocalDate.now();
    public static void main(String[] args) {

            int month=local.lengthOfMonth();
            System.out.println(month);

    }
}

6
कुछ स्पष्टीकरण भी जोड़ें।
ब्लैकबर्ड

1
ढेर अतिप्रवाह में आपका स्वागत है! हालांकि यह कोड स्निपेट समाधान हो सकता है, स्पष्टीकरण सहित वास्तव में आपके पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है।
yivi

0

पुरानी CalendarAPI के उपयोग से बचना चाहिए।

Java8 या उच्चतर संस्करण में, इसके साथ किया जा सकता है YearMonth

उदाहरण कोड:

int year = 2011;
int month = 2;
YearMonth yearMonth = YearMonth.of(year, month);
int lengthOfMonth = yearMonth.lengthOfMonth();
System.out.println(lengthOfMonth);

Call requires API level 26 (current min is 21): java.time.YearMonth#lengthOfMonth
व्लाद

0

यदि आप वर्ष और महीने के मूल्य को हार्डकोड नहीं करना चाहते हैं और आप वर्तमान तिथि और समय से मान लेना चाहते हैं तो इसे आसान बनाएं:

Date d = new Date();
String myDate = new SimpleDateFormat("dd/MM/yyyy").format(d);
int iDayFromDate = Integer.parseInt(myDate.substring(0, 2));
int iMonthFromDate = Integer.parseInt(myDate.substring(3, 5));
int iYearfromDate = Integer.parseInt(myDate.substring(6, 10));

YearMonth CurrentYear = YearMonth.of(iYearfromDate, iMonthFromDate);
int lengthOfCurrentMonth = CurrentYear.lengthOfMonth();
System.out.println("Total number of days in current month is " + lengthOfCurrentMonth );

0

आप Calendar.getActualMaximum विधि का उपयोग कर सकते हैं:

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month-1);
int numDays = calendar.getActualMaximum(Calendar.DATE);

और माह -1 है क्योंकि महीने का अपना मूल महीना है, जबकि विधि कैलेंडर में तर्क के रूप में नीचे लेती है

public int getActualMaximum(int field) {
   throw new RuntimeException("Stub!");
}

और (इंट फील्ड) नीचे की तरह है।

public static final int JANUARY = 0;
public static final int NOVEMBER = 10;
public static final int DECEMBER = 11;

0

निम्नलिखित विधि आपको एक विशेष महीने में दिनों की संख्या प्रदान करेगी

public static int getNoOfDaysInAMonth(String date) {
    Calendar cal = Calendar.getInstance();
    cal.setTime(date);
    return (cal.getActualMaximum(Calendar.DATE));
}

0

एक इष्टतम और प्रदर्शन करने वाला विचरण:

public static int daysInMonth(int month, int year) {
    if (month != 2) {
        return 31 - (month - 1) % 7 % 2;
    }
    else {
        if ((year & 3) == 0 && ((year % 25) != 0 || (year & 15) == 0)) { // leap year
            return 29;
        } else {
            return 28;
        }
    }
}

लीप एल्गोरिथ्म पर अधिक जानकारी के लिए यहां देखें


-1
String  MonthOfName = "";
int number_Of_DaysInMonth = 0;

//year,month
numberOfMonth(2018,11); // calling this method to assign values to the variables MonthOfName and number_Of_DaysInMonth 

System.out.print("Number Of Days: "+number_Of_DaysInMonth+"   name of the month: "+  MonthOfName );

public void numberOfMonth(int year, int month) {
    switch (month) {
        case 1:
            MonthOfName = "January";
            number_Of_DaysInMonth = 31;
            break;
        case 2:
            MonthOfName = "February";
            if ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))) {
                number_Of_DaysInMonth = 29;
            } else {
                number_Of_DaysInMonth = 28;
            }
            break;
        case 3:
            MonthOfName = "March";
            number_Of_DaysInMonth = 31;
            break;
        case 4:
            MonthOfName = "April";
            number_Of_DaysInMonth = 30;
            break;
        case 5:
            MonthOfName = "May";
            number_Of_DaysInMonth = 31;
            break;
        case 6:
            MonthOfName = "June";
            number_Of_DaysInMonth = 30;
            break;
        case 7:
            MonthOfName = "July";
            number_Of_DaysInMonth = 31;
            break;
        case 8:
            MonthOfName = "August";
            number_Of_DaysInMonth = 31;
            break;
        case 9:
            MonthOfName = "September";
            number_Of_DaysInMonth = 30;
            break;
        case 10:
            MonthOfName = "October";
            number_Of_DaysInMonth = 31;
            break;
        case 11:
            MonthOfName = "November";
            number_Of_DaysInMonth = 30;
            break;
        case 12:
            MonthOfName = "December";
            number_Of_DaysInMonth = 31;
    }
}

-1

इसने मेरे लिए ठीक काम किया।

यह एक नमूना आउटपुट है

import java.util.*;

public class DaysInMonth { 

    public static void main(String args []) { 

        Scanner input = new Scanner(System.in); 
        System.out.print("Enter a year:"); 

        int year = input.nextInt(); //Moved here to get input after the question is asked 

        System.out.print("Enter a month:"); 
        int month = input.nextInt(); //Moved here to get input after the question is asked 

        int days = 0; //changed so that it just initializes the variable to zero
        boolean isLeapYear = (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); 

        switch (month) { 
            case 1: 
                days = 31; 
                break; 
            case 2: 
                if (isLeapYear) 
                    days = 29; 
                else 
                    days = 28; 
                break; 
            case 3: 
                days = 31; 
                break; 
            case 4: 
                days = 30; 
                break; 
            case 5: 
                days = 31; 
                break; 
            case 6: 
                days = 30; 
                break; 
            case 7: 
                days = 31; 
                break; 
            case 8: 
                days = 31; 
                break; 
            case 9: 
                days = 30; 
                break; 
            case 10: 
                days = 31; 
                break; 
            case 11: 
                days = 30; 
                break; 
            case 12: 
                days = 31; 
                break; 
            default: 
                String response = "Have a Look at what you've done and try again";
                System.out.println(response); 
                System.exit(0); 
        } 

        String response = "There are " + days + " Days in Month " + month + " of Year " + year + ".\n"; 
        System.out.println(response); // new line to show the result to the screen. 
    } 
} //abhinavsthakur00@gmail.com

-1
String date = "11-02-2000";
String[] input = date.split("-");
int day = Integer.valueOf(input[0]);
int month = Integer.valueOf(input[1]);
int year = Integer.valueOf(input[2]);
Calendar cal=Calendar.getInstance();
cal.set(Calendar.YEAR,year);
cal.set(Calendar.MONTH,month-1);
cal.set(Calendar.DATE, day);
//since month number starts from 0 (i.e jan 0, feb 1), 
//we are subtracting original month by 1
int days = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
System.out.println(days);

किसी भी प्रश्न का उत्तर देने की आवश्यकता नहीं है जो पहले से ही स्वीकार किया जाता है, जब तक कि कोई भी उत्तर अमान्य न हो।
दीपक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.