如何计算一段时间内的天数?

M.K*_*.K. 40 java java-8

对于以下Period计算:

Period.between(LocalDate.of(2015, 8, 1), LocalDate.of(2015, 9, 2))
Run Code Online (Sandbox Code Playgroud)

结果是:

P1M1D
Run Code Online (Sandbox Code Playgroud)

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

为此Period:

Period.between(LocalDate.of(2015, 8, 1), LocalDate.of(2015, 10, 2))
Run Code Online (Sandbox Code Playgroud)

结果是:

P2M1D
Run Code Online (Sandbox Code Playgroud)

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

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

Sak*_*tal 76

文档:

要使用基于日期的值(年,月,日)定义时间量,请使用Period该类.的Period类提供各种获取方法,例如getMonths,getDays,和getYears.要呈现在时间的单个单元,测量的时间量>如天,可以使用 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)");
Run Code Online (Sandbox Code Playgroud)

代码生成类似于以下内容的输出:

You are 53 years, 4 months, and 29 days old. (19508 days total)
Run Code Online (Sandbox Code Playgroud)

  • 他们为什么不把这种方法放在"期间"本身? (10认同)
  • 谢谢。我使用 period.getDays() 时不知道它只返回天数部分。 (5认同)
  • @Carcamano (1) 因为月份有不同的长度,所以一段时间,比如 1 个月 1 天,并没有定义具体的天数。它可以是 29、30、31 或 32。而且 (2) 这正是“周期”的一种性质,它计算年、月和日,而不仅仅是日。您可以在变量中包含句点并将其添加到任何“LocalDate”或其他日期时间对象。如果您坚持认为 1 个月 1 天的“期间”也应该定义这是否意味着 29 天或 32 天,那么作为一般做法,添加将不再有意义。 (4认同)
  • 请“时间量”修复格式 (3认同)

K E*_*son 19

没有办法做你所要求的.原因是a不可能Period推断出该期间的实际日历天数.A Period与特定日期无关,一旦按照您显示的方式构建,它将失去对实际日历日期的跟踪.

例如,您的第一个期间代表1个月和1天的期间.但这个时期并不关心哪一个月.它只是"一个月,一天"的概念.

如果您需要两个日期之间的天数,您应该使用ChronoUnit.DAYS.betweenSaket Mittal写道.


Ual*_*Jr. 5

有一个特定的对象取决于您要处理的时间。这页这里是非常有用的解释这是最适合您的方案。

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

LocalDate localDateStartDate = LocalDate.of(2016, 06, 10);
LocalDate localDateEndDate = LocalDate.of(2016,06,23);
long days = ChronoUnit.DAYS.between(localDateStartDate, localDateEndDate);
Run Code Online (Sandbox Code Playgroud)