【问题标题】:Java compare two Dates Year, month and dayJava比较两个日期年月日
【发布时间】:2017-07-15 01:06:01
【问题描述】:

我有一种方法可以比较两个日期,以查看 transactionDate 是否在 validFrom 和 validUntil 之间,validFrom 和 validUnti 的值类似于“2017-01-01 00:00:00”,但交易日期有时会有不同的时间由于转换到不同的时区。

public boolean isDateWithinEmploymentDeploymentValidityPeriod(Date transcationDate, Parameter parameter) {
    return transcationDate.compareTo(parameter.getValidFrom()) >= 0
            && (parameter.getValidUntil() == null || transcationDate.compareTo(parameter.getValidUntil()) <= 0);
}

所以我只需要比较年月和日而不考虑时间,如果不将日期转换为 gregorianCalendar 并分别获取年月和日,那么最有效的方法是什么?

【问题讨论】:

  • 小心:您需要在特定时区进行转换才能获取日期字段。 Date 没有时区。
  • 什么是validFrom和validUntil?日期?字符串?您发布的代码有什么问题(假设您忘记将 compareTo 粘贴到 transcationDate.(parameter.getValidUntil()) 中?
  • 问题是我不应该在比较时累积小时数,它不应该依赖于时区,例如,如果 validUntil 是“2017-03-01 00:00:00”并且 transactionDate 来了"2017-03-01 10:00:00" 我应该返回 true 表示它在有效期内,validUntil 和 validFrom 是 Date 对象
  • 考虑到您上次评论中的示例,我不确定我是否理解您的推理。 validUntil 是您日期期间的上限,不是吗?那么它为什么要返回true 并带有晚于它的日期呢?或者这只是一个错字,也许?另外,您使用的是哪个版本的 Java?
  • @klehelley 他只想考虑年、月和日,而忽略其他。这就是他回归真实的原因。

标签: java date compare


【解决方案1】:

如果您使用的是 Java Calendar,正如您在问题中所说的那样,或者可能依赖像 Joda-Time 这样的第三方库)。

希望您使用 Java 8,这样我们就可以利用 java.time 包的优点。由于您只想比较日期(而不是时间),而不关心时区,因此您要使用的是java.time.LocalDate

// Ideally, instances of the java.time classes are used throughout
// the application making this method useless.
private LocalDate toLocalDate(Date date) {
    return LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()).toLocalDate();
}

public boolean inRange(Date date, Date from, Date until) {
    return inRange(toLocalDate(date), toLocalDate(from), toLocalDate(until));
}

public boolean inRange(LocalDate date, LocalDate from, LocalDate until) {
    return !date.isBefore(from) && !date.isAfter(until);
}

【讨论】:

    【解决方案2】:

    LocalDate

    我认为简单的解决方案是转换为LocalDate

    LocalDate validFrom = LocalDate.parse("2017-01-01 00:00:00", DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss"));
    

    LocalDateaccepts parsing with a pattern 包括小时、分钟和秒,它只是忽略字符串中的这些值。

    validUntil 和交易日期执行相同操作。使用isBefore()isAfter()isEqual()compareTo() 比较生成的LocalDate 实例。

    【讨论】:

      【解决方案3】:

      您可以使用日历,将除年、月、日之外的其他参数设置为0。

      Calendar transactionCalendar= Calendar.getInstance();
      
      Date transactionDate = ...;
      
      transactionCalendar.setTime(transactionDate );
      transactionCalendar.set(Calendar.HOUR_OF_DAY, 0);
      transactionCalendar.set(Calendar.MINUTE, 0);
      transactionCalendar.set(Calendar.SECOND, 0);
      transactionCalendar.set(Calendar.MILLISECOND, 0);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多