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

Vit*_*lie 4 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());
}
Run Code Online (Sandbox Code Playgroud)

为什么我会得到12 0?

Tun*_*aki 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
}
Run Code Online (Sandbox Code Playgroud)

现在,在您的问题中,您想要打印每个月的天数.您可以简单地拥有以下内容:

for (Month month : Month.values()) {
    System.out.println(month.length(Year.now().isLeap()));
}
Run Code Online (Sandbox Code Playgroud)

在Java Time中,Month所有月份都有一个枚举,该方法length(leapYear)返回本月的长度,即该月的天数.由于这取决于当前年份是否是闰年,因此有一个布尔参数.

要检查当前年度,Year.now()如果是闰年,我们可以致电并返回isLeap().


作为旁注,如果您真的想要打印两个日期之间的天数,则需要使用ChronoUnit.DAYS.between(start, end).