Belirli bir yılın belirli bir ayındaki gün sayısı?


158

Belirli bir yılın belirli bir ayında kaç gün olduğunu nasıl bilebilirim?

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
Sorunuz tam olarak nedir?
ShaMan-H_Fel

Bilginize gibi korkunç zahmetli eski tarih-saat sınıfları java.util.Date, java.util.Calendarve java.text.SimpleDateFormatşimdi mirası supplanted, java.time sonra Java 8 ve yerleşik sınıflara. Oracle'ın Öğreticisine bakın .
Basil Bourque

Yanıtlar:


368

Java 8 ve üstü

Warren M. Nocos. Java 8'in yeni Tarih ve Saat API'sını kullanmaya çalışıyorsanız , java.time.YearMonthsınıfı kullanabilirsiniz . Bkz. Oracle Eğitimi .

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

Test: artık yılda bir ay deneyin:

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

Java 7 ve öncesi

Takvim oluşturma, yıl ve ayı ayarlama ve kullanma 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

Test : artık yılda bir ay deneyin:

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

2
Java 8'in yeni Tarih ve Saat API'sinde nasıl yapılır?
Warren M. Nocos

2
@ WarrenM.Nocos geç cevap için üzgünüm, ama bu ay aktif değildi. java 8 çözümü için lütfen düzenlemeyi kontrol edin
Hemant Metalia

Java 8'den önceki sürümlerde olduğu gibi … java.time işlevinin çoğu , ThreeTen-Backport projesinde Java 6 ve Java 7'ye geri taşınmıştır . ThreeTenABP projesinde daha önceki Android için daha da uyarlandı . Bkz . ThreeTenABP nasıl kullanılır… .
Basil Bourque

43

Java.util.Calendar kodu

Eğer kullanımına varsa java.util.Calendar, istediğin şüpheli:

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

Joda Saati Kodu

Ancak, şahsen, başlamak için Joda Time'ı kullanmanızı öneririm java.util.{Calendar, Date}, bu durumda kullanabilirsiniz:

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

Dize değerlerini ayrı ayrı ayrıştırmak yerine, ayrıştırmak için hangi tarih / saat API'sini kullanırsanız kullanmanın daha iyi olacağını unutmayın. Gelen java.util.*bir uygulama yapabilirsiniz SimpleDateFormat; Joda Time'da a DateTimeFormatter.


27

Calendar.getActualMaximumYöntemi kullanabilirsiniz :

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;

Takvim c = Calendar.getInstance (); c.set (Takvim.DAY_OF_MONTH, c.getActualMaximum (Takvim.DAY_OF_MONTH)); // gerçek maksimum coz'u almadan önce yılı ayarlayabilirsiniz, bunlar aynı olmayabilir. yani 2011 ve 2012 şubeleri aynı uzunlukta değil (artık yıl)
Rose

5

Matematiksel yol budur:

Yıl, ay (1 ila 12) için:

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

Ben böyle bir çözüm için gitmek istiyorum:

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

Ay Şubat değilse (vakaların% 92'si), yalnızca aya bağlıdır ve yılı dahil etmemek daha verimlidir. Bu şekilde, artık bir yıl olup olmadığını öğrenmek için mantığı çağırmanıza gerek yoktur ve yılı vakaların% 92'sinde almanıza gerek yoktur. Ve yine de temiz ve okunabilir bir kod.


1
Tüm mantığı kanıtlanmış bir kütüphane yöntemine bırakmayı tercih ederim - bence çok erken optimizasyon yapıyorsunuz ve kütüphane yöntemleri bu kadar verimsiz değil. Hala modern java.time kullanımı için seçildi.
Ole VV

@ OleV.V. Doğru, çoğu durumda optimizasyonu kanıtlanmış bir kütüphaneye bırakmak daha iyi olabilir. Ancak, bu durumda, mevcut kütüphanelerin bir ay ve bir yıl geçmesi gerekecektir. Bu, yöntem, vakaların% 92'sinde değeri kullanmasa bile, yılı almak için ne gerekiyorsa yapmam gerektiği anlamına gelir. Yani, bu benim için optimize edemediği bir kısım. Akıl yürütmem, devre dışı bırakılabilecek bir günlükçüye geçirilecek bir değer elde etmek için bir yöntem çağrısı yapmamanızın nedenine benzer. Kaydedicinin bunu optimize etmesinin hiçbir yolu yoktur.
Stefan Mondelaers

1

Java8'de bir tarih alanından get ValueRange kullanabilirsiniz.

LocalDateTime dateTime = LocalDateTime.now();

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

Bu, sahada parametreleştirmenizi sağlar.


1

Bu kadar basit, hiçbir şey içe aktarmaya gerek yok

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

Geçmiş tarihlere veya çok ilerideki tarihlere ihtiyacınız yoksa, sorun değil. 100'ün katları olan ancak 400'ün katları olmayan Şubat yıllarında bu yanlış olacaktır. Ama katılıyorum, çoğu uygulamada bu yapacak ve verimli.
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
Android ( android.util.MonthDisplayHelper) için dikkat
çekmeye

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
Bu cevap mevcut ve kabul edilen cevaplar üzerinde ne gibi bir değer sağlıyor? Ayrıca, lütfen kodunuzla birlikte bir açıklama veya anlatım ekleyin. StackOverflow bir snippet kütüphanesinden daha fazlasıdır.
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
Bazı açıklamalar da ekleyin.
Blackeard

1
Stack Overflow'a hoş geldiniz! Bu kod snippet'i çözüm olsa da, bir açıklama da dahil olmak üzere mesajınızın kalitesini artırmaya yardımcı olur. Gelecekte okuyucular için soruyu cevapladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceğini unutmayın.
yivi

0

Eski CalendarAPI kullanımından kaçınılmalıdır.

Java8 veya daha yüksek bir sürümde bu ile yapılabilir YearMonth.

Örnek kod:

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

Yıl ve ay değerini sabit kodlamak istemiyorsanız ve değeri geçerli tarih ve saatten almak istiyorsanız bunu basitleştirelim:

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 yöntemini kullanabilirsiniz:

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

Ve ay-1, ay nedeniyle orjinal ay sayısını alırken yöntemde Calendar.class içinde aşağıdaki gibi argüman alır

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

Ve (int alanı) aşağıdaki gibidir.

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

0

Aşağıdaki yöntem, belirli bir aydaki gün sayısını sağlayacaktır

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

0

Optimum ve performanslı bir varyans:

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

Sıçrama algoritması hakkında daha fazla bilgi için burayı kontrol edin


-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

Bu benim için iyi çalıştı.

Bu bir Örnek Çıktıdır

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

Zaten kabul edilen bir soruya cevap vermeye gerek yok, bu cevap geçersiz olana kadar.
Deepak
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.