Jef*_*Jef 4 java time android jodatime
我试图检查当前时间是在开始之后LocalTime还是在另一个结束之前LocalTime,即开始时间加上11个小时.如果开始时间是11:00(结束时间是22:00),这可以正常工作.但是,当我尝试比较16:00的开始时间和03:00的结束时间时,currentTime.isBefore(endTime)将永远不会记录,但它应该是.
LocalTime currentTime = LocalTime.now(); //21:14
LocalTime startTime = new LocalTime( 16, 00, 0, 0);
LocalTime endTime = startTime.plusHours(11); //03:00 Midnight
if(currentTime.isAfter(startTime)){
Log.v("Test", "After startTime");
}
if(currentTime.isBefore(endTime)){
Log.v("Test", "Before endTime");
}
Run Code Online (Sandbox Code Playgroud)
任何想法如何解决这个问题?
基本上你需要检查你的startTime和endTime是否倒置(即如果endTime之前startTime).如果是,那必须是"夜间"间隔,你应该把它看作是反过来的,并反转结果.
public boolean isWithinInterval(LocalTime start, LocalTime end, LocalTime time) {
if (start.isAfter(end)) {
return !isWithinInterval(end, start, time);
}
// This assumes you want an inclusive start and an exclusive end point.
return start.compareTo(time) <= 0 &&
time.compareTo(end) < 0;
}
Run Code Online (Sandbox Code Playgroud)
现在唯一奇怪的是,如图所示,开始时间通常是包含的,结束时间是独占的 - 而如果我们反转结果(和参数),我们有一个包含的结束时间和一个独占的开始时间.因此,您可能希望明确处理这些案例:
public boolean isWithinInterval(LocalTime start, LocalTime end, LocalTime time) {
if (start.isAfter(end)) {
// Return true if the time is after (or at) start, *or* it's before end
return time.compareTo(start) >= 0 ||
time.compareTo(end) < 0;
} else {
return start.compareTo(time) <= 0 &&
time.compareTo(end) < 0;
}
}
Run Code Online (Sandbox Code Playgroud)
(当然,您如何选择使用哪个目标和参数compareTo取决于您.有多种方法可以有效地编写相同的代码.)
简短而完整的例子:
import org.joda.time.LocalTime;
public class Test {
public static void main(String[] args) {
LocalTime morning = new LocalTime(6, 0, 0);
LocalTime evening = new LocalTime(18, 0, 0);
LocalTime noon = new LocalTime(12, 0, 0);
LocalTime midnight = new LocalTime(0, 0, 0);
System.out.println(isWithinInterval(morning, evening, noon)); // true
System.out.println(
isWithinInterval(morning, evening, midnight)); // false
System.out.println(
isWithinInterval(evening, morning, noon)); // false
System.out.println(
isWithinInterval(evening, morning, midnight)); // true
}
public static boolean isWithinInterval(LocalTime start,
LocalTime end,
LocalTime time) {
if (start.isAfter(end)) {
// Return true if the time is after (or at) start,
// *or* it's before end
return time.compareTo(start) >= 0 ||
time.compareTo(end) < 0;
} else {
return start.compareTo(time) <= 0 &&
time.compareTo(end) < 0;
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4883 次 |
| 最近记录: |