【问题标题】:Display the number of days in every month with Java Time使用 Java Time 显示每个月的天数
【发布时间】:2016-02-10 11:15:59
【问题描述】:

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

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?

【问题讨论】:

  • 因为您认为 1 个月的时间段在没有参照系的情况下就天数而言有任何意义? ;)

标签: java time java-time


【解决方案1】:

您在这里没有正确使用Period 类。 start 代表日期 01/01/2016dd/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中,所有月份都有一个枚举Monthlength(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)));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-06-25
      • 2019-10-27
      • 1970-01-01
      • 2011-09-08
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 1970-01-01
      相关资源
      最近更新 更多