使用 Java 8 查找两个日期之间的中间日期

Find the Median Date between two dates using Java 8

我发现听起来很难。

所以,我有一个最大日期和一个最小日期,我需要找到这两个日期之间的中间日期。我使用 Java 8 来查找我的最大和最小日期,

LocalDate gerbutsmin = YearMonth.now().plusMonths(2).atDay(1);
LocalDate gerbutsmax = YearMonth.now().plusMonths(15).atDay(1);

这之后我该怎么办?也许我需要切换回Calander?

尝试使用 DAYS.between():

LocalDate gerbutsmin = YearMonth.now().plusMonths(2).atDay(1);
LocalDate gerbutsmax = YearMonth.now().plusMonths(15).atDay(1);
long numDays = ChronoUnit.DAYS.between(gerbutsmin, gerbutsmax);
LocalDate median = gerbutsmin.plusDays(numDays / 2L);  // plusDays takes a long
System.out.println(median);

2019-03-17
(output as of today, which is 2019-07-26)

Demo

如果您的最小日期和最大日期之间的差异为奇数,则存在边界条件。在这种情况下,没有正式的中位数天数,而是中位数会落在两天之间。

注:

如果您想知道极端情况下到底发生了什么,如果最低日期是今天 (2018-07-26) 而最高日期是三天后 (2018-07-29),那么中位数将报告为 2018-07-27.

LocalDate gerbutsmin = YearMonth.now().plusMonths(2).atDay(1);
LocalDate gerbutsmax = YearMonth.now().plusMonths(15).atDay(1);

LocalDate median = gerbutsmin.plusDays(ChronoUnit.DAYS.between(gerbutsmin, gerbutsmax) / 2);

"Middle of two dates" 没有明确定义 - 您必须决定如何处理相隔奇数天的日期(例如,一个月的 1 号和 4 号之间,或 1 号和 2 号之间的中间日期是多少),以及如何处理日期对象的时间部分。

您的方法的具体问题是日期不是数字,因此您不能将它们相加并除以二。为此,请使用 getTime() 方法获取自纪元以来的秒数,并对其进行操作:

var middate = new Date((startdate.getTime() + enddate.getTime()) / 2.0);

这将为您提供两个日期之间的中间日期,将它们视为时间点。

点击here

LocalDateTime startime = LocalDateTime.now();
LocalDateTime endtime = startime.plusDays(4);
    
long diff = endtime.until(startime, ChronoUnit.MINUTES);
LocalDateTime middleTime = startime.plusMinutes(diff / 2);