使用Java Time显示每个月的天数

时间:2016-02-10 11:16:00

标签: java time 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 0?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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)));