时间比较

2022-09-01 06:24:42

我有时间,它必须由用户以该格式输入。hh:mm

但是,我想比较时间(例如11:22)是在上午10点到下午6点之间吗?但是我该如何比较呢?


答案 1

Java(还没有)有一个好的内置类(它有一个用于JDBC查询的类,但这不是你想要的)。Time

一种选择是使用JodaTime API及其LocalTime类。

坚持使用内置的Java API,你就会陷入java.util.Date的困境。您可以使用 SimpleDateFormat 来解析时间,然后比较函数查看它是在其他时间之前还是之后:Date

SimpleDateFormat parser = new SimpleDateFormat("HH:mm");
Date ten = parser.parse("10:00");
Date eighteen = parser.parse("18:00");

try {
    Date userDate = parser.parse(someOtherDate);
    if (userDate.after(ten) && userDate.before(eighteen)) {
        ...
    }
} catch (ParseException e) {
    // Invalid date was entered
}

或者,您可以只使用一些字符串操作,也许是正则表达式来提取小时和分钟部分,将它们转换为数字并进行数字比较:

Pattern p = Pattern.compile("(\d{2}):(\d{2})");
Matcher m = p.matcher(userString);
if (m.matches() ) {
    String hourString = m.group(1);
    String minuteString = m.group(2);
    int hour = Integer.parseInt(hourString);
    int minute = Integer.parseInt(minuteString);

    if (hour >= 10 && hour <= 18) {
        ...
    }
}

这完全取决于你想要完成什么。


答案 2

使用 Java 8+,您可以使用新的 Java 时间 API:

  • 解析时间:

    LocalTime time = LocalTime.parse("11:22")
    
  • 要进行日期比较,您必须和 - 请注意,这些方法是严格的LocalTime::isBeforeLocalTime::isAfter

所以你的问题就简单了:

public static void main(String[] args) {
  LocalTime time = LocalTime.parse("11:22");
  System.out.println(isBetween(time, LocalTime.of(10, 0), LocalTime.of(18, 0)));
}

public static boolean isBetween(LocalTime candidate, LocalTime start, LocalTime end) {
  return !candidate.isBefore(start) && !candidate.isAfter(end);  // Inclusive.
}

对于包含性开头但排他性结尾(半开),请使用此行。

return !candidate.isBefore(start) && candidate.isBefore(end);  // Exclusive of end.

推荐