我正试图解决一个看似简单的问题,但是我不能完全理解它。
我有两次startTime
和stopTime
,可以认为格式为:hh:mm:ss
[24小时格式]。
现在第三次 - timeToTest
- 我需要找出timeToTest
和startTime
之间是否有stopTime
。除了时间之外,没有涉及日期信息。
例如 - 如果我有startTime
= '22:30:00'
和stopTime
= '03:30:00'
,那么对于timeToTest
= '01:14:23'
,测试应该回归真实。
我已尝试使用java.util.Date
的解决方案,使用getTime()
将时间转换为毫秒,但如果任何时间间隔超过24小时障碍,逻辑将失败。
我正在尝试使用Java构建解决方案 - 但我相信逻辑与语言无关。
答案 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.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
注意:如果不包含开始时间和停止时间,则更改条件如下:
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 desugaring 和 How to use ThreeTenABP in Android Project。
答案 4 :(得分:1)
怎么样:
第一步可能很容易被分解:
所有这些在Joda Time中编写可能比使用java.util。*更容易:顺便说一下:)
答案 5 :(得分:0)
我强烈推荐java.util.Calendar,before()和after()可能很有用。但是,您需要与您的时间一起指定的日期为5/18/2011。是否可以指定模拟日期(或您的案例中的一对日期)来利用日历?