【问题标题】:Configure listener window depends on time [duplicate]配置侦听器窗口取决于时间[重复]
【发布时间】:2020-11-18 16:22:17
【问题描述】:

我想创建一个方法来告诉我我是否在两个小时之间(即使我选择不同日期的小时数) 例如:

Current time: 20:00, start: 21:00, end: 23:00 -> returns false
Current time: 22:00, start: 21:00, end: 23:00 -> returns true
Current time: 01:00, start: 21:00, end: 8:00 -> returns true
Current time: 22:00, start: 21:00, end: 20:00 -> returns true
Current time: 05:00, start: 21:00, end: 4:00 -> returns false

有没有简单干净的方法来做到这一点?

【问题讨论】:

  • 看看isBeforeisAfter
  • I want to create a method that tells me if i'm between two hours (even if I choose hours from different days)...Is there any simple and clean way to do this? - 如果没有日期,最简洁的方法是在所有情况下都返回 true。 ??????
  • 即使此处给出的答案比其他问题下接受的答案更好,我也选择关闭为副本。那边有一个更彻底的answer by Basil Bourque,我相信值得你关注。

标签: java time


【解决方案1】:

您可以为此使用LocalTime(因为您希望它独立于日期或时区或类似的东西)。它有isBefore 和类似的方法,使这变得非常简单:

public static boolean isBetween(LocalTime before, LocalTime candidate, LocalTime after) {
    return before.isBefore(candidate) && candidate.isBefore(after);
}

用法很简单:

System.out.println(isBetween(LocalTime.of(20, 0), LocalTime.now(), LocalTime.of(23, 0));

编辑

看来您实际上想要另一个允许范围重叠一天的逻辑。你的例子是:

Current time: 01:00, start: 21:00, end: 8:00 -> returns true

为了使这成为可能,我将引入以下更改。

首先,您可以通过简单地检查before 是否实际上是之前 after 来检测此事件。如果没有,那么您就有这种情况。接下来,确定now 是在before 还是after 当天,然后将另一个分别重置为一天的开始 (00:00) 或一天的结束 (23:59)。之后您可以再次通过正常方式进行比较,如前所示:

public static boolean isBetween(LocalTime before, LocalTime candidate, LocalTime after) {
    // Special handling for day-overlap
    if (before.isAfter(after)) {
        // Identify on which day candidate is and reset the other
        if (before.isBefore(candidate)) {
            after = LocalTime.MAX;
        } else {
            before = LocalTime.MIN;
        }
    }

    return before.isBefore(candidate) && candidate.isBefore(after);
}

【讨论】:

  • 它不适用于第三种情况 :) 它应该是这样的 if (endTime.isBefore(startTime)) { return (now.isAfter(startTime) && now.isBefore(LocalTime.of(23, 59, 59))) || (now.isBefore(endTime) && now.isAfter(LocalTime.of(0, 0, 0))); } return now.isAfter(startTime) && now.isBefore(endTime);
  • @domvnski 那是因为您的第三种情况不符合逻辑和您制定的规则。 21:00 不在01:00 之前。我明白你的意图,但如果你想忽略几天,这是不正确的逻辑。因此,在这种情况下,您实际上确实希望有日常逻辑。
  • @domvnski 我已经相应地编辑了我的帖子,以向您展示一种简洁易读的方式。
猜你喜欢
  • 1970-01-01
  • 2015-12-26
  • 2016-06-14
  • 1970-01-01
  • 2022-08-05
  • 2021-02-09
  • 1970-01-01
  • 1970-01-01
  • 2011-10-27
相关资源
最近更新 更多