Java的.检查时间范围.怎么样?

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.

你能给我一些想法或算法吗?我该如何实现这个方法?

Mik*_*uel 5

首先,你应该学习使用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.