使用 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)
如果您的最小日期和最大日期之间的差异为奇数,则存在边界条件。在这种情况下,没有正式的中位数天数,而是中位数会落在两天之间。
注:
如果您想知道极端情况下到底发生了什么,如果最低日期是今天 (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);
我发现听起来很难。
所以,我有一个最大日期和一个最小日期,我需要找到这两个日期之间的中间日期。我使用 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)
如果您的最小日期和最大日期之间的差异为奇数,则存在边界条件。在这种情况下,没有正式的中位数天数,而是中位数会落在两天之间。
注:
如果您想知道极端情况下到底发生了什么,如果最低日期是今天 (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);