特定时间间隔内的时间

时间:2010-07-21 09:23:28

标签: java date time

我正试图解决一个看似简单的问题,但是我不能完全理解它。

我有两次startTimestopTime,可以认为格式为:hh:mm:ss [24小时格式]。

现在第三次 - timeToTest - 我需要找出timeToTeststartTime之间是否有stopTime。除了时间之外,没有涉及日期信息。

例如 - 如果我有startTime = '22:30:00'stopTime = '03:30:00',那么对于timeToTest = '01:14:23',测试应该回归真实。

我已尝试使用java.util.Date的解决方案,使用getTime()将时间转换为毫秒,但如果任何时间间隔超过24小时障碍,逻辑将失败。

我正在尝试使用Java构建解决方案 - 但我相信逻辑与语言无关。

6 个答案:

答案 0 :(得分:3)

所以我能提出的最简单的解决方案,坚持普通的java.util.Date,如下所示:

    String d1 = "21:00:00";
    String d2 = "04:00:00";
    SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
    String dToTest = "16:00:00";
    boolean isSplit = false, isWithin = false;

    Date dt1 = null, dt2 = null,  dt3 = null;

    dt1 = sdf.parse(d1);
    dt2 = sdf.parse(d2);
    dt3 = sdf.parse(dToTest);

    isSplit = (dt2.compareTo(dt1) < 0);
    System.out.println("[split]: " +isSplit);

    if (isSplit)
    {
        isWithin = (dt3.after(dt1) || dt3.before(dt2));
    }
    else
    {
        isWithin = (dt3.after(dt1) && dt3.before(dt2));
    }

    System.out.println("Is time within interval? " +isWithin);

随时指出任何错误 - 愿意工作并修复它。

答案 1 :(得分:2)

您必须添加“日”,其中“0”==当前日期,“1”==第二天,依此类推。所以实际上stopTime == '03:30:00' '27:30:00'时应该是stopTime < startTime(即第二天)。

在您的情况下,如果{{1}},则添加86400秒。

答案 2 :(得分:2)

anirvan使用JodaTime的解决方案:

public class TimeInterval24H {
    private final LocalTime start;
    private final LocalTime end;

    public TimeInterval24H(LocalTime start, LocalTime end) {
        this.start = start;
        this.end = end;
    }

    public TimeInterval24H(Date start, Date end) {
        this(new LocalTime(start), new LocalTime(end));
    }

    public boolean contains(Date test) {
        return contains(new LocalTime(test));
    }

    public boolean contains(LocalTime test) {
        if (isAccrossTwoDays()) {
            return (test.isAfter(getStart()) || test.isBefore(getEnd()));
        } else {
            return (test.isAfter(getStart()) && test.isBefore(getEnd()));
        }
    }

    boolean isAccrossTwoDays() {
        return getEnd().isBefore(getStart());
    }

    public LocalTime getStart() {
        return start;
    }

    public LocalTime getEnd() {
        return end;
    }

}

答案 3 :(得分:2)

java.time

java.util 日期时间 API 及其格式化 API SimpleDateFormat 已过时且容易出错。建议完全停止使用它们并切换到 modern Date-Time API*

另外,下面引用的是来自 home page of Joda-Time 的通知:

<块引用>

请注意,从 Java SE 8 开始,要求用户迁移到 java.time (JSR-310) - JDK 的核心部分,取代了该项目。

使用 java.time(现代日期时间 API)的解决方案:

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class Main {
    public static void main(String[] args) {
        String strStartTime = "22:30:00", strStopTime = "03:30:00", strTestTime = "01:14:23";
        LocalDate today = LocalDate.now();

        LocalDateTime startTime = today.atTime(LocalTime.parse(strStartTime));

        LocalDateTime stopTime = today.atTime(LocalTime.parse(strStopTime));
        if (stopTime.isBefore(startTime))
            stopTime = stopTime.plusDays(1);

        LocalDateTime testTime = today.atTime(LocalTime.parse(strTestTime));
        if (testTime.isBefore(startTime))
            testTime = testTime.plusDays(1);

        if (!testTime.isBefore(startTime) && !testTime.isAfter(stopTime))
            System.out.println(strTestTime + " is at or after " + strStartTime + " and is before or at " + strStopTime);
    }
}

输出:

01:14:23 is at or after 22:30:00 and is before or at 03:30:00

ONLINE DEMO

注意:如果不包含开始时间和停止时间,则更改条件如下:

if (testTime.isAfter(startTime) && testTime.isBefore(stopTime))
    System.out.println(strTestTime + " is after " + strStartTime + " and is before " + strStopTime);

Trail: Date Time 了解有关现代 Date-Time API 的更多信息。


* 出于任何原因,如果您必须坚持使用 Java 6 或 Java 7,您可以使用 ThreeTen-Backport,它将大部分 java.time 功能向后移植到 Java 6 & 7. 如果您正在为 Android 项目工作并且您的 Android API 级别仍然不符合 Java-8,请检查 Java 8+ APIs available through desugaringHow to use ThreeTenABP in Android Project

答案 4 :(得分:1)

怎么样:

  • 查找开始时刻后指定时间的下一次出现
  • 检查该事件是否在结束时刻之前

第一步可能很容易被分解:

  • 指定的时间是时间的开始时刻?
    • 是:下一次出现的时间是与开始时刻同一天的时间
    • 否:下一次出现的是下一个天从开始时刻开始的时间

所有这些在Joda Time中编写可能比使用java.util。*更容易:顺便说一下:)

答案 5 :(得分:0)

我强烈推荐java.util.Calendar,before()和after()可能很有用。但是,您需要与您的时间一起指定的日期为5/18/2011。是否可以指定模拟日期(或您的案例中的一对日期)来利用日历?