【问题标题】:How to calculate the number of days in a period?如何计算一个周期的天数?
【发布时间】:2015-06-14 19:27:11
【问题描述】:

对于下面的Period 计算:

Period.between(LocalDate.of(2015, 8, 1), LocalDate.of(2015, 9, 2))

结果是:

P1M1D

这相当于 31 天 + 1 天 = 32 天。

为此Period

Period.between(LocalDate.of(2015, 8, 1), LocalDate.of(2015, 10, 2))

结果是:

P2M1D

这相当于:31 天(8 月)+ 30 天(9 月)+ 1(10 月)= 62 天

java.time 包中是否有一个方法可以给出Period 中的天数?我找不到一个。不确定我是否忽略了任何东西,或者它只是不存在。

【问题讨论】:

  • Period有方法long get(TemporalUnit unit),TemporalUnit可以是ChronoUnit.DAYS
  • @cyrbil 但这并不能满足 OP 的要求,试试看。

标签: java java-8


【解决方案1】:

来自documentation

使用基于日期的值(年、月、 天),使用Period 类。 Period 类提供了各种get 方法,例如 getMonthsgetDaysgetYears。要显示以单个时间单位(例如天)测量的时间量,您可以使用 ChronoUnit.between 方法。

LocalDate today = LocalDate.now();
LocalDate birthday = LocalDate.of(1960, Month.JANUARY, 1);

Period p = Period.between(birthday, today);
long p2 = ChronoUnit.DAYS.between(birthday, today);
System.out.println("You are " + p.getYears() + " years, " + p.getMonths() +
                   " months, and " + p.getDays() +
                   " days old. (" + p2 + " days total)");

代码产生类似于以下的输出:

You are 53 years, 4 months, and 29 days old. (19508 days total)

【讨论】:

  • 他们为什么不把那个方法放在Period 本身?
  • 谢谢。我在使用 Period.getDays() 时不知道它只返回天数部分。
  • @Carcamano (1) 因为月份有不同的长度,所以一个周期,比如 1 个月 1 天,没有定义具体的天数。它可能是 29、30、31 或 32。并且 (2) 这正是 Period 的品质,它计算的是年、月和日,而不仅仅是日。您可以在变量中添加句点并将其添加到任何 LocalDate 或其他日期时间对象。如果您坚持认为 1 个月 1 天的 Period 也应该定义这意味着 29 天还是 32 天,那么作为一般做法,添加将不再有意义。
【解决方案2】:

没有办法按照你的要求去做。原因是无法从Period 推断出该期间的实际日历天数。 Period 与特定日期无关,一旦以您显示的方式构建,它就会失去对实际日历日期的跟踪。

例如,您的第一个时期代表 1 个月零 1 天的时期。但期间不关心是哪一个月。简直就是“一个月零一天”的概念。

如果您需要两个日期之间的天数,您应该使用 ChronoUnit.DAYS.between,正如 Saket Mittal 所写。

【讨论】:

  • 是的,我意识到了这一点。我只是想知道如何恢复丢失的信息,以便计算天数。谢谢。
【解决方案3】:

根据您想要处理的时间量,有一个特定的对象。 此页面here 非常有用,可以解释哪种方案最适合您的方案。

ChronoUnit.between 方法在您只想测量单个时间单位(例如天或秒)中的时间量时很有用

LocalDate localDateStartDate = LocalDate.of(2016, 06, 10);
LocalDate localDateEndDate = LocalDate.of(2016,06,23);
long days = ChronoUnit.DAYS.between(localDateStartDate, localDateEndDate);

【讨论】:

    猜你喜欢
    • 2015-05-05
    • 2010-09-22
    • 2015-02-03
    • 1970-01-01
    • 1970-01-01
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多