Java 计算包括两个给定日期在内的天数

Java 计算包括两个给定日期在内的天数,java,date,java-time,date-difference,localdate,Java,Date,Java Time,Date Difference,Localdate,在java中,如何计算两个LocalDate之间的天数? 我试过这样做 LocalDate startDate = LocalDate.parse("2016-11-02"); LocalDate endDate = LocalDate.parse("2016-11-04"); long days = startDate.until(endDate, ChronoUnit.DAYS); //and long days= ChronoUnit.DAYS.between(startDate,

在java中,如何计算两个
LocalDate
之间的天数? 我试过这样做

LocalDate startDate = LocalDate.parse("2016-11-02");
LocalDate endDate = LocalDate.parse("2016-11-04");

long days = startDate.until(endDate, ChronoUnit.DAYS);

//and

long days= ChronoUnit.DAYS.between(startDate, endDate);

//and

long days= Duration.between(startDate.atStartOfDay(), endDate.atStartOfDay()).toDays();
以上都给出了两个日期之间的天数,但如何计算这两个日期。
按照上述步骤,天数为2天,但需要3天。

如果您想要24小时的工作日,可以使用
持续时间
类:

long days = Duration.between(startDate.atStartOfDay(), endDate.atStartOfDay()).toDays() + 1;
有关更多信息,请参阅Java SE 8日期和时间。

很明显,计算中不包括结束日期。因此,您只需添加1:

long days = ChronoUnit.DAYS.between(startDate, endDate) + 1;
tl;博士 在一段时间内,开始是包容的,结束是排斥的,这是常态

如果你绝对不能遵循这个方法,那就添加一个

days = days + 1 ;
半开 定义时间跨度的一种常见而明智的方法是半开放式方法。开始是包含的,而结束是独占的

有时,但并非总是,我们在日常生活中直觉地使用这种方法。例如,一个教室的午餐时间是中午到下午1点,这意味着所有的学生都要回到教室,并在13:00上课前做好准备。据说上课时间是下午1点到2点。因此,跨距可以彼此邻接而不重叠,也不需要确定一个小时的最后一分钟中无限可分的最后一秒的最后一刻

我建议在所有的日期-时间编码中都采用这种方法,通过减少解决包含-排除歧义的认知负担,可以使代码更易于阅读、更易于调试、更不容易出错

time类始终使用半开放的方法

long days = ChronoUnit.DAYS.between( start , stop ) ;  // Half-open
如果您的代码必须返回一个结束的包含结果,只需在java.time结果中添加一个

long daysClosed = ( days + 1 ) ;

理想情况下,您应该在代码和用户界面中一致地使用半开放,同时教育用户注意模糊性问题。我见过无数的商人错误地认为日期范围是开放的
()
,封闭的
[]
,或半开放的
[)
,甚至有时是相反的半封闭的
(]
而作者的意思是另一个。

最好使用java.time.Duration包含两个给定日期的可能重复-不就是添加1的问题吗???
Duration
有一个
plusDays
方法可以为您实现这一点。为什么要硬编码+1。为什么不使用预定义方法的精确计数。我理解您的问题stion,但在这种情况下,我认为硬编码+1没有什么害处。日期和时间间隔的非官方标准是使用半开,即包括开始和不包括结束。因此,您必须减去1才能得到独占计数(仅在两者之间的一天)相反,如果希望计数包含在内,则需要添加一个。我认为需要添加+1以使两个日期都包含在内。between的定义为:
between(Temporal start inclusive,Temporal endExclusive)