如何计算一段时间内有多少天?

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

对于以下

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
中的天数?我找不到一个。不确定我是否忽略了任何东西,或者它是否只是不存在。

java java-8
5个回答
156
投票

来自文档

使用基于日期的值(年、月、 天),使用

Period
类。
Period
类提供了各种get 方法,例如
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)");

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

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

30
投票

没有办法按照你的要求去做。原因是无法从

Period
推断出该期间的实际日历天数。
Period
与特定日期无关,一旦按照您显示的方式构建,它就会失去实际日历日期的跟踪。

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

如果您需要两个日期之间的天数,您应该使用

ChronoUnit.DAYS.between
,正如 Saket Mittal 所写。


13
投票

根据您想要处理的时间长短,有一个特定的对象。 此页面此处非常有用,解释了哪一个最适合您的场景。

当您只想测量单个时间单位(例如天或秒)的时间量时,ChronoUnit. Between 方法非常有用

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

0
投票

ChronoUnit 工作正常,但它需要 API 级别 26,如果您仍然像我一样以 API 级别 24 为目标,我发现这个替代方案效果很好:

val start = LocalDate.now()
val end = LocalDate.now().plusYears(1)
val totalDays = Duration.between(start.atStartOfDay(), end.atStartOfDay()).toDays()

atStartOfDay 会将 LocalDate 转换为 LocalDateTime,时间设置为 00:00,因此我们可以使用 Duration 计算来获取日期之间的总天数


0
投票

您可以只使用 LocalDate

until
方法。例如:

LocalDate startDate = LocalDate.now().minusYears(1);
LocalDate endDate = LocalDate.now();

Long days = startDate.until(endDate, ChronoUnit.DAYS);
System.out.println(days);

这会产生以下输出:

365
© www.soinside.com 2019 - 2024. All rights reserved.