Số ngày trong tháng cụ thể của năm cụ thể?


158

Làm thế nào để biết có bao nhiêu ngày có tháng cụ thể của năm cụ thể?

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
Chính xác câu hỏi của bạn là gì?
ShaMan-H_Fel

FYI, người già lớp ngày thời gian khủng khiếp phiền hà như java.util.Date, java.util.Calendarjava.text.SimpleDateFormatbây giờ là di sản , thay thế bởi sự java.time class built vào Java 8 và sau đó. Xem Hướng dẫn của Oracle .
Basil Bourque

Câu trả lời:


367

Java 8 trở lên

@Warren M. Nocos. Nếu bạn đang cố gắng sử dụng API Ngày và Giờ mới của Java 8 , bạn có thể sử dụng java.time.YearMonthlớp. Xem Hướng dẫn của Oracle .

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

Kiểm tra: thử một tháng trong một năm nhuận:

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

Java 7 trở về trước

Tạo lịch, đặt năm và tháng và sử dụng 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

Kiểm tra : thử một tháng trong một năm nhuận:

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

2
Làm cách nào để làm điều này trên API Ngày và Giờ mới của Java 8?
Warren M. Nocos

2
@ WarrenM.Nocos xin lỗi vì phản hồi muộn, nhưng tôi đã không hoạt động trong những tháng này. vui lòng kiểm tra chỉnh sửa cho giải pháp cho java 8.
Hemant Metalia

Như trước Java 8, Phần lớn chức năng java.time được chuyển ngược lại sang Java 6 & Java 7 trong dự án ThreeTen-Backport . Thích nghi hơn nữa cho Android trước đó trong dự án ThreeTenABP . Xem Cách sử dụng ThreeTenABP .
Basil Bourque

43

Mã cho java.util.CalWiki

Nếu bạn phải sử dụng java.util.Calendar, tôi nghi ngờ bạn muốn:

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

Mã cho thời gian Joda

Tuy nhiên, cá nhân tôi khuyên bạn nên sử dụng Joda Time thay vì java.util.{Calendar, Date}bắt đầu, trong trường hợp đó bạn có thể sử dụng:

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

Lưu ý rằng thay vì phân tích các giá trị chuỗi riêng lẻ, sẽ tốt hơn nếu lấy bất kỳ API ngày / giờ nào bạn đang sử dụng để phân tích cú pháp. Trong java.util.*bạn có thể sử dụng SimpleDateFormat; trong Joda Time bạn sẽ sử dụng a DateTimeFormatter.


26

Bạn có thể sử dụng Calendar.getActualMaximumphương pháp:

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;

Lịch c = Lịch.getInstance (); c.set (Lịch.DAY_OF_MONTH, c.getActualMaximum (Lịch.DAY_OF_MONTH)); // bạn có thể đặt năm trước khi bạn nhận được số lượng tối đa thực tế, chúng có thể không giống nhau. tức là feb của năm 2011 và 2012 không dài bằng nhau (năm nhuận)
Rose

5

Đây là cách toán học:

Đối với năm, tháng (1 đến 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

Tôi sẽ đi cho một giải pháp như thế này:

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();
}

Nếu tháng không phải là tháng hai (92% trường hợp), thì chỉ phụ thuộc vào tháng và sẽ hiệu quả hơn nếu không liên quan đến năm. Bằng cách này, bạn không phải gọi logic để biết liệu đó có phải là năm nhuận hay không và bạn không cần phải lấy năm đó trong 92% trường hợp. Và nó vẫn còn sạch và rất dễ đọc mã.


1
Tôi muốn để lại toàn bộ logic cho một phương pháp thư viện đã được chứng minh - Tôi nghĩ rằng bạn đang tối ưu hóa rất sớm và các phương pháp thư viện không hiệu quả. Vẫn được nâng cấp để sử dụng java.time hiện đại.
Ole VV

@ OleV.V. Đúng, trong nhiều trường hợp, việc để tối ưu hóa cho một thư viện đã được chứng minh có thể tốt hơn. Nhưng, trong trường hợp này, các thư viện hiện tại sẽ yêu cầu phải vượt qua một tháng và năm. Vì vậy, điều đó có nghĩa là tôi cần phải làm bất cứ điều gì cần thiết để có được năm dù cho dù phương thức đó không sử dụng giá trị trong 92% các trường hợp. Vì vậy, đó là một phần nó không thể tối ưu hóa cho tôi. Lý do của tôi tương tự như lý do tại sao bạn không nên thực hiện một cuộc gọi phương thức để có được một giá trị được chuyển đến một logger có thể bị vô hiệu hóa. Không có cách nào mà logger có thể tối ưu hóa điều đó.
Stefan Mondelaers

1

Trong Java8, bạn có thể sử dụng get ValueRange từ trường ngày.

LocalDateTime dateTime = LocalDateTime.now();

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

Điều này cho phép bạn tham số hóa trên trường.


1

Đơn giản như vậy, không cần nhập gì cả.

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;
}

Điều này là ổn, nếu bạn không cần ngày lịch sử hoặc ngày trong tương lai xa. Đối với tháng hai của năm là bội số của 100 nhưng không phải là bội số của 400, điều đó sẽ sai. Nhưng tôi đồng ý, trong hầu hết các ứng dụng, điều này sẽ làm và nó hiệu quả.
Stefan Mondelaers

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
Đáng lưu ý rằng nó dành cho Android ( android.util.MonthDisplayHelper)
barbsan

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
Câu trả lời này cung cấp giá trị gì cho câu trả lời hiện có và được chấp nhận? Ngoài ra, vui lòng thêm một số giải thích hoặc tường thuật cùng với mã của bạn. StackOverflow không chỉ là một thư viện đoạn trích.
Basil Bourque

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
Thêm một số giải thích là tốt.
BlackBeard

1
Chào mừng bạn đến với Stack Overflow! Mặc dù đoạn mã này có thể là giải pháp, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho độc giả trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn.
yivi

0

CalendarNên tránh sử dụng API lỗi thời .

Trong Java8 hoặc phiên bản cao hơn, điều này có thể được thực hiện với YearMonth.

Mã ví dụ:

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
Vlad

0

Hãy làm cho nó đơn giản nếu bạn không muốn mã hóa giá trị của năm và tháng và bạn muốn lấy giá trị từ ngày và giờ hiện tại:

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

Bạn có thể sử dụng phương thức Calendar.getActualMaximum:

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

Và tháng 1 là vì tháng lấy số tháng ban đầu của nó trong khi trong phương thức lấy đối số như bên dưới trong Lịch. Lớp

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

Và (trường int) giống như dưới đây.

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

0

Phương pháp sau đây sẽ cung cấp cho bạn không có ngày nào trong một tháng cụ thể

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

0

Một phương sai tối ưu và hiệu suất:

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;
        }
    }
}

Để biết thêm chi tiết về thuật toán nhảy kiểm tra ở đây


-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

Điều này làm việc tốt cho tôi.

Đây là một đầu ra mẫu

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);

Không cần trả lời một câu hỏi đã được chấp nhận, cho đến khi câu trả lời đó không hợp lệ như thế nào.
Deepak
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.