Как получить количество дней в данном месяце с Jodatime? - программирование
Подтвердить что ты не робот

Как получить количество дней в данном месяце с Jodatime?

30 days hath September,
   April, June and November,
 All the rest have 31,
   Excepting February alone
(And that has 28 days clear,
   With 29 in each leap year).

Могу ли я получить эту информацию анаграммой? (Я не имею в виду стихотворение, конечно)

4b9b3361

Ответ 1

Если у вас есть объект DateTime, который представляет значение в месяце, то это довольно просто. Вы получаете свойство dayOfMonth из этого объекта DateTime и получаете максимальное значение свойства. Вот примерная функция:

public static int daysOfMonth(int year, int month) {
  DateTime dateTime = new DateTime(year, month, 14, 12, 0, 0, 000);
  return dateTime.dayOfMonth().getMaximumValue();
}

Ответ 2

Да, хотя это не так красиво, как могло бы быть:

import org.joda.time.*;
import org.joda.time.chrono.*;
import org.joda.time.field.*;

public class Test {
    public static void main(String[] args) {
        GregorianChronology calendar = GregorianChronology.getInstance();
        DateTimeField field = calendar.dayOfMonth();

        for (int i = 1; i < 12; i++) {
            LocalDate date = new LocalDate(2010, i, 1, calendar);
            System.out.println(field.getMaximumValue(date));
        }
    }
}

Обратите внимание, что я жестко закодировал предположение, что есть 12 месяцев, и нас интересует 2010 год. Я явно выбрал григорианскую хронологию, хотя - в других хронологиях вы получили бы разные ответы, конечно, (И цикл "12 месяцев" не будет действительным предположением либо...)

Я пошел для LocalDate, а не DateTime, чтобы получить значение, чтобы подчеркнуть (хотя и слабо), что это значение не зависит от часового пояса.

Это все еще не так просто, как кажется, подумайте. Я не знаю, что произойдет, если вы используете одну хронологию для построения LocalDate, но задайте максимальное значение поля в другой хронологии. У меня есть некоторые идеи о том, что может произойти, зная определенную сумму о времени Джоды, но это, вероятно, не очень хорошая идея:)

Ответ 3

Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, yourMonth);
cal.set(Calendar.YEAR, yourYear);
cal.getActualMaximum(Calendar.DAY_OF_MONTH); // <-- the result!

Ответ 4

Вот еще одна простая функция:

int daysOfMonth(DateTime dt) {
    int month = dt.getMonthOfYear();
    int month2 = month;
    int days = dt.getDay();
    DateTime dt2 = dt;
    while (month == month2 ) {
       days++;
       dt2.addDays(1);
       month2 = dt2.getMonthOfYear();
    }
    return (days - 1);
}