Как получить количество дней в данном месяце с использованием Joda-Time? - PullRequest
55 голосов
/ 22 сентября 2010
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).

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

Ответы [ 4 ]

98 голосов
/ 22 сентября 2010

Если у вас есть объект 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();
}
4 голосов
/ 22 сентября 2010

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

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 году. IВы явно выбрали григорианскую хронологию, хотя - в других хронологиях вы получите разные ответы, конечно.(И цикл «12 месяцев» также не будет правильным предположением ...)

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

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

0 голосов
/ 21 ноября 2011

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

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);
}
0 голосов
/ 22 сентября 2010
Calendar cal = Calendar.getInstance();
cal.set(Calendar.MONTH, yourMonth);
cal.set(Calendar.YEAR, yourYear);
cal.getActualMaximum(Calendar.DAY_OF_MONTH); // <-- the result!
...