检查时间是否位于 12 小时时间跨度内的其他两个时间之间

check if the time lies between two other times in 12 hr time span

如果我正在检查的时间是在我第一次比较之前,我正在尝试的下面的代码是有效的。

如果 timeToCompare 在下午 6 点之后,它工作正常,如果它位于两个时间段之间,它工作正常,但前提是 01:00:00 AM 不在时间范围内,但仍进入 if 条件。

如有不妥请指正。

    String string1 = "07:00:00 AM";
    Date time1 = new SimpleDateFormat("HH:mm:ss a").parse(string1);
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(time1);


    String string2 = "06:00:00 PM";
    Date time2;
    time2 = new SimpleDateFormat("HH:mm:ss a").parse(string2);
    Calendar calendar2 = Calendar.getInstance();
    calendar2.setTime(time2);
    calendar2.add(Calendar.DATE, 1);

    String timeToCompare = "01:00:00 AM";
    System.out.println(formattedDate);
    Date d = new SimpleDateFormat("HH:mm:ss a").parse(timeToCompare);
    Calendar calendar3 = Calendar.getInstance();
    calendar3.setTime(d);
    calendar3.add(Calendar.DATE, 1);

我的 timeToCompare 但在 string1 和 string2 之间

    Date x = calendar3.getTime();
    if (x.after(calendar1.getTime()) && x.before(calendar2.getTime())) {
        //checkes whether the current time is between 14:49:00 and 20:11:13.
        System.out.println("Hi from time between given slots");
    }

1:00:00 AM 不在那些拖车时间的中间,但它仍在进入 if 条件并且正在打印 "Hi from time between given slots"

您正在为字符串 2 和字符串 3 添加一天。在内部,Java 将您的时间存储如下:

> calendar1.getTime()
Thu Jan 01 07:00:00 CST 1970
> calendar2.getTime()
Fri Jan 02 06:00:00 CST 1970
> calendar3.getTime()
Fri Jan 02 01:00:00 CST 1970

所以,你的时间范围比你想象的要大!

解析模式不正确

您应该使用小写 hh 作为小时值 1-12。大写 HH 表示 24 小时制 0-23.

java.time

您应该使用 Java 8 及更高版本中内置的新 java.time 框架。旧的 java.util.Date/.Calendar 和 SimpleDateFormat classes 是出了名的麻烦。

新框架包括 class 时间值 LocalTime。此 class 没有日期,也没有时区。但请注意如何需要时区来确定当前时间。

String string1 = "07:00:00 AM";
String string2 = "06:00:00 PM";
String string3 = "01:00:00 AM";

DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "hh:mm:ss a" , Locale.ENGLISH );

LocalTime localTime1 = formatter.parse ( string1 , LocalTime :: from );
LocalTime localTime2 = formatter.parse ( string2 , LocalTime :: from );
LocalTime localTime3 = formatter.parse ( string3 , LocalTime :: from );
LocalTime now = LocalTime.now ( ZoneId.of ( "America/Montreal" ) );

这些 LocalTime 对象具有方便的 isBeforeisAfterisEqual 方法。

Boolean isFirstInputEarlierThanNow = localTime1.isBefore ( now );

LocalTime class 也实现了 Comparable 接口。因此,您可以按照示例代码中所示对它们进行排序。

List<LocalTime> localTimes = Arrays.asList ( localTime1 , localTime2 , localTime3 , now );
Collections.sort ( localTimes );

LocalTime earliest = localTimes.get ( 0 ); // Index, meaning zero-based counting.
LocalTime latest = localTimes.get ( localTimes.size () - 1 ); // Index (zero-based counting), so subtract one.

转储到控制台。

System.out.println ( "localTimes: " + localTimes );
System.out.println ( "isFirstInputEarlierThanNow: " + isFirstInputEarlierThanNow );
System.out.println ( "earliest: " + earliest + " … latest: " + latest );

当运行.

localTimes: [01:00, 07:00, 18:00, 19:26:41.932]

isFirstInputEarlierThanNow: true

earliest: 01:00 … latest: 19:26:41.932