2016-02-10 1 views
4

Я пытаюсь отобразить количество дней в каждом месяце годаОтображение количества дней в каждом месяце с Java Time

LocalDate start = LocalDate.of(2016, 01, 01); 
LocalDate end = start.plusYears(1); 
Period everyMonth = Period.ofMonths(1); 
for (;start.isBefore(end); start = start.plus(everyMonth)) { 
    System.out.println(Period.between(start, start.plus(everyMonth)).getDays()); 
} 

Почему я получаю 12 0s?

+0

Поскольку вы предполагаете, что период в 1 месяц имеет какое-либо значение с точки зрения дней без рамки отсчета? ;) – Neil

ответ

6

Вы правильно не используя Period класс здесь. start представляет собой дату 01/01/2016 (в формате dd/MM/yyyy). Когда вы добавляете период в 1 месяц, результатом будет дата 01/02/2016.

Период между этими двумя датами, определяемый классом Period, составляет «1 месяц». Если вы печатаете период, вы будете иметь "P1M", который является образцом сказать, что:

Свидание на основе количества времени в календарной системе ISO-8601, например, «2-х лет, 3 месяца и 4 дней.

Как таковой, getDays(), которые возвращают количество дней в периоде, вернет 0. В результате, отличается от количества дней между двумя датами. Вы можете убедить себя в том, что при печати результата getMonths, он будет возвращать 1:

public static void main(String[] args) { 
    LocalDate start = LocalDate.of(2016, 01, 01); 
    Period period = Period.between(start, start.plus(Period.ofMonths(1))); 
    System.out.println(period.getDays()); // prints 0 
    System.out.println(period.getMonths()); // prints 1 
} 

Теперь в вашем вопросе, вы хотите напечатать количество дней в каждом месяце. Вы можете просто следующее:

for (Month month : Month.values()) { 
    System.out.println(month.length(Year.now().isLeap())); 
} 

В Java Time, есть перечисление Month для всех месяцев, и метод length(leapYear) возвращает длину в этом месяце, то есть количество дней в месяце. Поскольку это зависит от того, является ли текущий год високосным годом или нет, для этого существует логический аргумент.

Для проверки на текущий год, мы можем позвонить Year.now() и вернуться, если это високосный год или нет с isLeap().


В качестве побочного сведению, если вы действительно хотели напечатать число дней между двумя датами, вам нужно будет использовать ChronoUnit.DAYS.between(start, end).

2

Вы делаете все правильно, кроме одного. Вы пытаетесь напечатать дни в периоде, но поскольку вы всегда добавляете 1 месяц к дате, период составляет 0 years, 1 month, 0 days. При вызове getDays() она возвращает количество дней в периоде, который является 0.

final Period period = Period.between(start, start.plus(everyMonth); 
System.out.println(period.getDays()); // 0 
System.out.println(period.getMonths()); // 1 

Я думаю, что вы ищете:

System.out.println(ChronoUnit.DAYS.between(start, start.plus(everyMonth))); 

 Смежные вопросы

  • Нет связанных вопросов^_^