【问题标题】:Getting incorrect result when checking a date between two other dates in Java在 Java 中检查其他两个日期之间的日期时得到不正确的结果
【发布时间】:2019-08-31 03:05:00
【问题描述】:

我正在使用下面的代码来检查一个小时是否介于另外两个特定时间之间:

String openHour = "08:00 AM";
String currentHour = "10:00 PM";
String closeHour = "11:00 PM"; //Change to 02:00 AM doesn't work!!!

SimpleDateFormat format = new SimpleDateFormat("hh:mm a");
Date openHourDate = format.parse(openHour);
Date currentHourDate = format.parse(currentHour);
Date closeHourDate = format.parse(closeHour);

Calendar openCalendar = Calendar.getInstance();
openCalendar.setTime(openHourDate);

Calendar currentCalendar = Calendar.getInstance();
currentCalendar.setTime(currentHourDate);

Calendar closeCalendar = Calendar.getInstance();
closeCalendar.setTime(closeHourDate);

Date open = openCalendar.getTime();
Date current = currentCalendar.getTime();
Date close = closeCalendar.getTime();

if (current.after(open) && current.before(close)) {
    System.out.println("Correct!");
} else {
    System.out.println("Incorrect!");
}

如果currentHour"10:00 PM",正如您在我的代码中看到的那样,一切正常,但如果我将其更改为"02:00 AM",即使currentHour 介于两者之间,代码也不会按预期工作08:00 AM02:00 AM。如何解决?

【问题讨论】:

  • 这可能与您的程序将02:00AM 视为同一天这一事实有关吗?如果是这种情况,您是说今天的收盘时间是02:00 AM,但同一天的开盘时间是08:00 AM。如果是第二天,则需要在关闭时间中增加一天。
  • 您已使用 java 8 标记了您的问题,因此请查看 LocalTime 和此版本 JDK 引入的其他类似类
  • 您可以使用LocalDateTime等类添加一天
  • 所以通过文字解释有点棘手,但我会尝试。您的 close 值正在获取 Calendar 对象的实例并且只是设置时间对吗?这意味着您的opencurrentclose 设置为当前日期。这意味着您正在查看open 等于4/9/2019 0800 AM 并且接近4/9/2019 0200AM。当您运行检查时,您的current 设置为4/9/2019 1000PM 不在close 之前,因为close 设置为与current 同一天的凌晨0200。这更有意义吗?
  • 仅供参考,诸如 java.util.Datejava.util.Calendarjava.text.SimpleDateFormat 等非常麻烦的日期时间类现在是 legacy,被 Java 8 及更高版本中内置的 java.time 类所取代.见Tutorial by Oracle

标签: java java-8 java-time date java-calendar


【解决方案1】:

这是一个使用LocalTime 的解决方案,它还可以正确处理午夜之后的当前和关闭时间。

String openHour = "08:00 AM";
String currentHour = "01:00 PM";
String closeHour = "02:00 AM";

DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "hh:mm a" , Locale.US );
LocalTime openTime = LocalTime.parse(openHour, formatter);
LocalTime currentTime  = LocalTime.parse(currentHour, formatter);
LocalTime closeTime = LocalTime.parse(closeHour, formatter);

boolean isOpen = false;
if (closeTime.isAfter(openTime)) {
  if (openTime.isBefore(currentTime) && closeTime.isAfter(currentTime)) {
    isOpen = true;
  }
} else if (currentTime.isAfter(openTime) || currentTime.isBefore(closeTime)) {
  isOpen = true;
}

if (isOpen) {
  System.out.println("We are open");
} else {
  System.out.println("We are closed");
}

【讨论】:

  • 哇,解决了我的整个问题。这就是我一直在寻找的。非常感谢!
【解决方案2】:

正如迈克尔·普拉特建议的那样,只需要滚动一天:

import java.util.*;
import java.text.*;

public class Foo {
  public static void main(String[] args) throws Exception {

    String openHour = "08:00 AM";
    String currentHour = "10:00 PM";
    String closeHour = "11:00 PM"; //Change to 02:00 AM doesn't work!!!

    SimpleDateFormat format = new SimpleDateFormat("hh:mm a");
    Date openHourDate = format.parse(openHour);
    Date currentHourDate = format.parse(currentHour);
    Date closeHourDate = format.parse(closeHour);

    Calendar openCalendar = Calendar.getInstance();
    openCalendar.setTime(openHourDate);

    Calendar currentCalendar = Calendar.getInstance();
    currentCalendar.setTime(currentHourDate);

    Calendar closeCalendar = Calendar.getInstance();
    closeCalendar.setTime(closeHourDate);

    if (closeCalendar.before(openCalendar)) {
      closeCalendar.add(Calendar.DAY_OF_YEAR, 1);
    }

    Date open = openCalendar.getTime();
    Date current = currentCalendar.getTime();
    Date close = closeCalendar.getTime();

    if (current.after(open) && current.before(close)) {
      System.out.println("Correct!");
    } else {
      System.out.println("Incorrect!");
    }
  }
}

【讨论】:

  • 成功了。感谢您花时间回答我的问题。还有一个小问题,如果我把closeHour 改成01:00 AM,就不能再工作了,你知道为什么吗?
  • 这个解决方案不是最优的。它滥用日期时间类来保存仅时间值。它忽略了时区的关键问题,这些问题正在使用 JVM 当前的默认时区隐式应用——因此您的结果可能会在运行时有所不同。我们为这项工作开设了一个现代课程:LocalTime。所以使用它。见Answer by Danielson
  • @BasilBourque 感谢您提供现代解决方案。
猜你喜欢
  • 2022-07-21
  • 2021-08-23
  • 2017-02-08
  • 1970-01-01
  • 1970-01-01
  • 2023-02-07
  • 2015-10-02
  • 2013-10-04
  • 1970-01-01
相关资源
最近更新 更多