我试图显示一年中每个月的天数
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?
答案 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)));