【问题标题】:Find the Median Date between two dates using Java 8使用 Java 8 查找两个日期之间的中位数日期
【发布时间】:2018-07-26 13:12:08
【问题描述】:

我觉得听起来很难。

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

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

在此之后我将如何继续?也许我需要切换回 Calander?

【问题讨论】:

  • 嗨迈克尔,对不起,搞砸了。现在是 java.time
  • 嗨@Sriram,我相信蒂姆的回答比我的要好,应该接受它而不是我的。
  • @nytez Nah...您的代码运行,我对其进行了测试。享受收件箱中绿点的冲击:P
  • 应该没有理由切换回Calendar(还有很多理由不这样做)。中位数?你是说平均吗?两点之间的中位数似乎不是很有趣,我知道它是什么的几种不同定义。

标签: java java-time


【解决方案1】:

尝试使用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 .

【讨论】:

    【解决方案2】:
    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);
    

    【讨论】:

      【解决方案3】:

      “两个日期的中间日期”没有明确定义 - 您必须决定如何处理相隔奇数天的日期(例如,一个月的 1 日和 4 日之间或 1 日和 2 日之间的中间日期是什么),以及如何处理日期对象的时间部分。

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

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

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

      点击here

      【讨论】:

      • 关于歧义的观点。当询问 Java 8 并且询问者明确使用来自 java.time(现代 Java 日期和时间 API)的 LocalDate 时,请不要建议使用早已过时且设计不佳的 Date 类。 java.time 具有所需的所有功能以及更多功能。
      【解决方案4】:
      LocalDateTime startime = LocalDateTime.now();
      LocalDateTime endtime = startime.plusDays(4);
          
      long diff = endtime.until(startime, ChronoUnit.MINUTES);
      LocalDateTime middleTime = startime.plusMinutes(diff / 2); 
      

      【讨论】:

        猜你喜欢
        • 2020-07-19
        • 2018-06-28
        • 1970-01-01
        • 1970-01-01
        • 2018-07-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多