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

时间:2011-09-21 06:42:49

标签: java date time 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

你可以给我一些想法或算法吗?我如何实现这种方法?

2 个答案:

答案 0 :(得分:5)

首先,你应该学会使用Joda time

那就是说,由于时间都是零填充,你可以只是在词法上比较字符串。

public static boolean inRange(String time, String range) {
  return time.compareTo(range.substring(0, 5)) >= 0
      && time.compareTo(range.substring(6)) <= 0;
}

在畸形输入上快速失败是一种很好的做法。

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]");

然后在inRange的顶部放置一个断言:

assert VALID_TIME.matcher(time).matches() : time
assert VALID_RANGE.matcher(range).matches() : range

编辑:

如果你真的需要将当前时间表示为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));
   }
 }

使用Range.valueOfString进行转换,将您的Date转换为自午夜以来您喜欢的任何时区使用您喜欢的任何日历实施的分钟数,然后使用{{ 1}}。

答案 1 :(得分:1)

Date currentDate = new Date();
Date maxDate;
Date minDate;

//Parse range to two substrings
//parse two substrings to [HH, MM]
//for HH && MM parseInt()
//
minDate= new Date.SetHour(HH); minDate.SetMinute(MM);
//repeat for max date

if(currentDate.Before(maxDate) && currentDate.After(minDate))
{
return true;
}
else
return false;