use*_*011 1 java time date date-range
例如,我输入参数格式为:" 04:00-06:00"或" 23:00-24:00".参数类型 - String.
在我的方法中,我必须在当前时间之前检查输入参数NOT中的时间范围.我怎么能这样做?
更多细节:
输入时间范围:"
12:00-15:00"当前时间:
16:00.
在这种情况下,方法必须返回false.
另一个例子:
输入时间范围:"
10:30-12:10"当前时间:
09:51.
方法必须返回true.
你能给我一些想法或算法吗?我该如何实现这个方法?
首先,你应该学习使用Joda时间.
也就是说,由于时间都是零填充,你可以只是在词法上比较字符串.
public static boolean inRange(String time, String range) {
return time.compareTo(range.substring(0, 5)) >= 0
&& time.compareTo(range.substring(6)) <= 0;
}
Run Code Online (Sandbox Code Playgroud)
在错误输入上快速失败是一种很好的做法.
private static final Pattern VALID_TIME = Pattern.compile("[012][0-9]:[0-5][0-9]");
private static final Pattern VALID_RANGE = Pattern.compile("[012][0-9]:[0-5][0-9]-[012][0-9]:[0-5][0-9]");
Run Code Online (Sandbox Code Playgroud)
然后在上面放置一个断言inRange:
assert VALID_TIME.matcher(time).matches() : time
assert VALID_RANGE.matcher(range).matches() : range
Run Code Online (Sandbox Code Playgroud)
编辑:
如果你真的需要将当前时间表示为a Date,那么你应该这样比较它:
public final class Range {
/** Inclusive as minutes since midnight */
public final int start, end;
public Range(int start, int end) {
assert end >= start;
}
/** @param time in minutes since midnight */
public boolean contains(int time) {
return start <= time && time <= end;
}
public static Range valueOf(String s) {
assert VALID_RANGE.matcher(s).matches() : s;
return new Range(minutesInDay(s.substring(0, 5)),
minutesInDay(s.substring(6));
}
private static int minutesInDay(String time) {
return Integer.valueOf(time.substring(0, 2)) * 60
+ Integer.valueOf(time.substring(3));
}
}
Run Code Online (Sandbox Code Playgroud)
用于Range.valueOf从a String转换Date,使用您喜欢的任何日历实现,在您喜欢的任何时区从午夜转换为分钟数,然后使用Range.contains.