【问题标题】:Java: How to check whether given time lies between two times?Java:如何检查给定时间是否介于两个时间之间?
【发布时间】:2017-06-13 10:12:45
【问题描述】:

我想检查目标时间是否在两个给定时间之间,而不考虑使用 Java8 时间的日期。假设开始时间是 "21:30" ,结束时间是 "06:30" 并且目标时间是 "03:00" , 所以程序应该返回 true。

    @Test
    public void posteNuit()
    {
        DateTimeFormatter format = DateTimeFormatter.ofPattern("HH:mm");

        String s = "21:30";
        String e = "06:30";

        String t = "03:00";

        LocalTime startTime = LocalTime.parse(s, format);
        LocalTime endTime = LocalTime.parse(e, format);
        LocalTime targetTime = LocalTime.parse(t, format);

        if ( targetTime.isBefore(endTime) && targetTime.isAfter(startTime) ) {
            System.out.println("Yes! night shift.");
        } else {
            System.out.println("Not! night shift.");
        }
    }

【问题讨论】:

  • 如果您不使用日期,那么 03:00 将始终在 21:30 之前。
  • 顺便说一句,您不需要显式格式化程序。 LocalTime.parse("21:30") 产生预期时间。这是因为您的时间字符串符合 ISO 8601,这是java.time 类的默认格式。但是,该格式允许可选的秒数和秒数,因此如果您需要确保这些不存在于字符串中,最好保留您的格式化程序。
  • @OleV.V.谢谢你告诉。

标签: java time java-8 java-time


【解决方案1】:

您使用了 LocalTime,它不存储日期信息,只存储时间。 然后您尝试检查目标时间是否在开始时间之后(03:0021:30 之后)。这种说法是错误的。

您的开始时间应该早于结束时间。

如果您需要处理夜班,请尝试以下操作:

    if (startTime.isAfter(endTime)) {
        if (targetTime.isBefore(endTime) || targetTime.isAfter(startTime)) {
            System.out.println("Yes! night shift.");
        } else {
            System.out.println("Not! night shift.");
        }
    } else {
        if (targetTime.isBefore(endTime) && targetTime.isAfter(startTime)) {
            System.out.println("Yes! without night shift.");
        } else {
            System.out.println("Not! without night shift.");
        }
    }

【讨论】:

    【解决方案2】:

    在您的场景中,如果 startTime > endTime 无论 targetTime 是什么,您都会返回 true。

    所以更新 if 语句:

    if (( startTime.isAfter(endTime) && targetTime.isBefore(startTime)
            && targetTime.isAfter(endTime)  )
         || ( startTime.isBefore(endTime) && targetTime.isBefore(endTime) 
            && targetTime.isAfter(startTime) )) {
    

    【讨论】:

    • 无论targetTime如何,您的条件总是返回true,假设目标时间是21:29,它应该返回false而不是true。
    • 我不明白。 21:29 应该返回 false 而 21:30 应该返回 true 吗?你能给出用例吗,因为问题可能不清楚
    • 理解并编写了解决方案
    • 例如,在 21:30 (09:30 PM) 和 06:30 (06:30 AM) 之间的任何给定时间,程序应返回 true,否则返回 false。好吧,让我试试你的情况。
    猜你喜欢
    • 2021-06-29
    • 2013-07-15
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 2020-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多