用Java时间显示每个月的天数

问题描述 投票:0回答:3

我正在尝试显示一年中每个月的天数

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?

java time java-time
3个回答
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)));

0
投票

tl;博士

for ( Month m : Month.values() ) { … YearMonth.of( y , m ).lengthOfMonth() … }

Month
&
YearMonth

显示一年中每个月的天数

使用

Month
枚举,每月一个预定义对象。并使用
YearMonth
代表特定年份的每个月。

int year = 2025 ;
for ( Month month : Month.values() )
{
    YearMonth ym = YearMonth.of ( year , month ) ;
    int daysInMonth = ym.lengthOfMonth () ;
    System.out.println ( ym + " has " + daysInMonth + " days." ) ;
}

请参阅此 在 Ideone.com 上运行的代码

2025-01 has 31 days.
2025-02 has 28 days.
2025-03 has 31 days.
2025-04 has 30 days.
2025-05 has 31 days.
2025-06 has 30 days.
2025-07 has 31 days.
2025-08 has 31 days.
2025-09 has 30 days.
2025-10 has 31 days.
2025-11 has 30 days.
2025-12 has 31 days.
© www.soinside.com 2019 - 2024. All rights reserved.