Количество дней в конкретном месяце конкретного года? - PullRequest
136 голосов
/ 20 января 2012

Как узнать, сколько дней имеет определенный месяц конкретного года?

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

Ответы [ 19 ]

316 голосов
/ 20 января 2012

Java 8 и более поздние версии

@ Уоррен М. Нокос. Если вы пытаетесь использовать новый API даты и времени в Java 8 , вы можете использовать java.time.YearMonth класс. См. Oracle Tutorial .

// 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 

Java 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
37 голосов
/ 20 января 2012

Код для java.util.Calendar

Если вам нужно использовать java.util.Calendar, я подозреваю, что вы хотите:

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

Код для Joda Time

Лично я бы предложил для начала использовать Joda Time вместо java.util.{Calendar, Date}, в этом случае вы можете использовать:

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

Обратите внимание, что вместо того, чтобы анализировать строковые значения по отдельности, было бы лучше получить тот API даты / времени, который вы используете для его анализа. В java.util.* вы можете использовать SimpleDateFormat; в Joda Time вы бы использовали DateTimeFormatter.

21 голосов
/ 20 января 2012

Вы можете использовать Calendar.getActualMaximum метод:

Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.YEAR, year);
calendar.set(Calendar.MONTH, month);
int numDays = calendar.getActualMaximum(Calendar.DATE);
17 голосов
/ 07 марта 2016

java.time.LocalDate

В Java 1.8 вы можете использовать метод lengthOfMonth на java.time.LocalDate:

LocalDate date = LocalDate.of(2010, 1, 19);
int days = date.lengthOfMonth();
7 голосов
/ 02 марта 2013
if (month == 4 || month == 6 || month == 9 || month == 11)

daysInMonth = 30;

else 

if (month == 2) 

daysInMonth = (leapYear) ? 29 : 28;

else 

daysInMonth = 31;
4 голосов
/ 06 октября 2017

Это математический способ:

Для года, месяца (от 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;
1 голос
/ 26 июня 2019

Я бы пошел к решению, как это:

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 голос
/ 14 августа 2018

Все просто, не нужно ничего импортировать

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;
}
1 голос
/ 20 мая 2019
// 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 голос
/ 29 августа 2017

В Java8 вы можете использовать get ValueRange из поля даты.

LocalDateTime dateTime = LocalDateTime.now();

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

Это позволяет вам параметризовать поле.

...