Jumlah hari pada bulan tertentu di tahun tertentu?

158

Bagaimana cara mengetahui berapa hari memiliki bulan tertentu pada tahun tertentu?

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
Klausos Klausos
sumber
7
Apa sebenarnya pertanyaan Anda?
ShaMan-H_Fel
FYI, sangat merepotkan tua kelas tanggal-waktu seperti java.util.Date, java.util.Calendar, dan java.text.SimpleDateFormatsekarang warisan , digantikan oleh java.time kelas dibangun ke Jawa 8 dan kemudian. Lihat Tutorial oleh Oracle .
Basil Bourque

Jawaban:

368

Java 8 dan yang lebih baru

@ Warren M. Nocos. Jika Anda mencoba menggunakan API Tanggal dan Waktu Java 8 yang baru , Anda bisa menggunakan java.time.YearMonthkelas. Lihat Tutorial Oracle .

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

Tes: coba sebulan di tahun kabisat:

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

Java 7 dan sebelumnya

Buat kalender, atur tahun dan bulan dan gunakan 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

Tes : coba sebulan di tahun kabisat:

mycal = new GregorianCalendar(2000, Calendar.FEBRUARY, 1);
daysInMonth= mycal.getActualMaximum(Calendar.DAY_OF_MONTH);      // 29
Hemant Metalia
sumber
2
Bagaimana melakukan ini pada API Tanggal dan Waktu baru Java 8?
Warren M. Nocos
2
@ WarrenM.Nocos maaf atas keterlambatan respon, tetapi saya tidak aktif bulan ini. silakan periksa edit untuk solusinya untuk java 8.
Hemant Metalia
Adapun sebelum Java 8 ... Sebagian besar fungsi java.time di -porting ke Java 6 & Java 7 di proyek ThreeTen-Backport . Lebih lanjut diadaptasi untuk Android sebelumnya dalam proyek ThreeTenABP . Lihat Cara menggunakan ThreeTenABP… .
Basil Bourque
43

Kode untuk java.util.Calendar

Jika Anda harus menggunakan java.util.Calendar, saya curiga Anda ingin:

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

Kode untuk Joda Time

Namun secara pribadi, saya sarankan menggunakan Joda Time daripada java.util.{Calendar, Date}memulai, dalam hal ini Anda dapat menggunakan:

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

Perhatikan bahwa daripada mem-parsing nilai string secara individual, akan lebih baik untuk mendapatkan API tanggal / waktu apa pun yang Anda gunakan untuk menguraikannya. Di java.util.*Anda mungkin menggunakan SimpleDateFormat; di Joda Time Anda akan menggunakan a DateTimeFormatter.

Jon Skeet
sumber
27

Anda dapat menggunakan Calendar.getActualMaximummetode:

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

java.time.LocalDate

Dari Java 1.8, Anda dapat menggunakan metode ini lengthOfMonthdi java.time.LocalDate:

LocalDate date = LocalDate.of(2010, 1, 19);
int days = date.lengthOfMonth();
Alexandre DuBreuil
sumber
7
if (month == 4 || month == 6 || month == 9 || month == 11)

daysInMonth = 30;

else 

if (month == 2) 

daysInMonth = (leapYear) ? 29 : 28;

else 

daysInMonth = 31;
zoidbot
sumber
Kalender c = Calendar.getInstance (); c.set (Calendar.DAY_OF_MONTH, c.getActualMaximum (Calendar.DAY_OF_MONTH)); // Anda dapat mengatur tahun sebelum Anda mendapatkan maksimum coz yang sebenarnya mungkin tidak sama. yaitu Februari 2011 dan 2012 tidak sama panjang (tahun kabisat)
Rose
5

Ini adalah cara matematika:

Untuk tahun, bulan (1 hingga 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;
Shl
sumber
3

Saya akan mencari solusi seperti ini:

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

Jika bulan itu bukan Februari (92% dari kasus), itu tergantung pada bulan saja dan lebih efisien untuk tidak melibatkan tahun. Dengan cara ini, Anda tidak perlu memanggil logika untuk mengetahui apakah ini tahun kabisat dan Anda tidak perlu mendapatkan tahun tersebut dalam 92% kasus. Dan itu masih kode bersih dan sangat mudah dibaca.

Stefan Mondelaers
sumber
1
Saya lebih suka meninggalkan seluruh logika ke metode pustaka yang terbukti - saya pikir Anda mengoptimalkan secara prematur, dan metode pustaka tidak begitu tidak efisien. Masih tervvotikasi untuk penggunaan java.time modern.
Ole VV
@ OleV.V. Benar, dalam banyak kasus menyerahkan pengoptimalan ke pustaka yang terbukti bisa lebih baik. Tetapi, dalam hal ini, perpustakaan yang ada harus lulus satu bulan dan satu tahun. Jadi itu berarti saya harus melakukan apa pun untuk mendapatkan tahun ini walaupun metode tersebut tidak menggunakan nilai dalam 92% kasus. Jadi, itu bagian yang tidak bisa saya optimalkan. Alasan saya mirip dengan alasan mengapa Anda tidak harus melakukan pemanggilan metode untuk mendapatkan nilai untuk diteruskan ke logger yang mungkin dinonaktifkan. Tidak mungkin logger dapat mengoptimalkannya.
Stefan Mondelaers
1

Di Java8 Anda bisa menggunakan get ValueRange dari bidang kencan.

LocalDateTime dateTime = LocalDateTime.now();

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

Ini memungkinkan Anda untuk membuat parameter pada bidang.

Jamie Lister
sumber
1

Sesederhana itu, tidak perlu mengimpor apa pun

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;
}
Ajay Chauhan
sumber
Ini OK, jika Anda tidak memerlukan tanggal atau tanggal bersejarah di masa mendatang. Untuk bulan Februari tahun yang merupakan kelipatan 100 tetapi tidak kelipatan 400, itu akan salah. Tapi saya setuju, di sebagian besar aplikasi ini akan dilakukan dan efisien.
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();
pengguna11527435
sumber
1
Perlu dicatat bahwa ini untuk 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);


    }

}
Madhi Vanan
sumber
1
Nilai apa yang diberikan jawaban ini atas jawaban yang ada dan diterima? Juga, tolong tambahkan beberapa penjelasan atau narasi bersama dengan kode Anda. StackOverflow lebih dari sekedar pustaka potongan.
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);

    }
}
Nodirbek Hasanboev
sumber
6
Tambahkan beberapa penjelasan juga.
BlackBeard
1
Selamat Datang di Stack Overflow! Sementara cuplikan kode ini mungkin solusinya, termasuk penjelasan sangat membantu untuk meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa depan, dan orang-orang itu mungkin tidak tahu alasan untuk saran kode Anda.
yivi
0

Penggunaan usang Calendar API yang harus dihindari.

Dalam Java8 atau versi yang lebih tinggi, ini bisa dilakukan dengan YearMonth .

Kode contoh:

int year = 2011;
int month = 2;
YearMonth yearMonth = YearMonth.of(year, month);
int lengthOfMonth = yearMonth.lengthOfMonth();
System.out.println(lengthOfMonth);
pengguna6690200
sumber
Call requires API level 26 (current min is 21): java.time.YearMonth#lengthOfMonth
Vlad
0

Mari kita buat sesederhana itu jika Anda tidak ingin hardcode nilai tahun dan bulan dan Anda ingin mengambil nilai dari tanggal dan waktu saat ini:

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 );
RANA DINESH
sumber
0

Anda dapat menggunakan metode Calendar.getActualMaximum:

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

Dan bulan-1 adalah Karena bulan mengambil jumlah aslinya bulan sedangkan dalam metode mengambil argumen seperti di bawah ini di Calendar.class

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

Dan bidang (int) seperti di bawah ini.

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

Metode berikut ini akan memberi Anda jumlah hari dalam bulan tertentu

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

Varians yang optimal dan berkinerja:

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

Untuk detail lebih lanjut tentang algoritma lompatan, periksa di sini

pembuat sihir
sumber
-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;
    }
}
azhar
sumber
-1

Ini bekerja dengan baik untuk saya.

Ini adalah Output Sampel

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. 
    } 
} //[email protected]
Abhinav S Thakur
sumber
-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);
Nagaraju Budigam
sumber
Tidak perlu menjawab pertanyaan yang sudah diterima, sampai jawaban itu tidak valid bagaimanapun caranya.
Deepak