Как получить количество дней в данном месяце с 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).
Могу ли я получить эту информацию анаграммой?
(Я не имею в виду стихотворение, конечно)
Ответы
Ответ 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);
}