时间比较

新手上路,请多包涵

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

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

原文由 sling 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 511
2 个回答

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

一种选择是使用 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) {
        ...
    }
}

这真的完全取决于你想要完成的事情。

原文由 Adam Batkin 发布,翻译遵循 CC BY-SA 2.5 许可协议

在 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.

原文由 assylias 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题