Джава.Проверьте временной диапазон.Как? - PullRequest
1 голос
/ 21 сентября 2011

Например, у меня есть входной параметр этого формата: "04:00-06:00" или "23:00-24:00".Тип параметра - String.

И в моем методе я должен проверить, что временной диапазон во входном параметре НЕ раньше текущего времени.Как я могу это сделать?

Подробнее:

диапазон ввода времени: "12:00-15:00"

текущее время: 16:00.

В этом случае метод должен вернуть false.

Другой пример:

диапазон времени ввода: "10:30-12:10"

currentвремя: 09:51.

метод должен возвращать true.

Не могли бы вы дать мне идею или алгоритм?Как я могу реализовать этот метод?

Ответы [ 2 ]

5 голосов
/ 21 сентября 2011

Прежде всего, вы, вероятно, должны просто научиться использовать Время Joda .

Тем не менее, поскольку все времена заполнены нулями, вы можете просто сравнивать строки лексически.

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

EDIT:

Если вам действительно нужно представить текущее время как 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.valueOf для преобразования из String, конвертируйте Date в количество минут с полуночи в любом часовом поясе, используя любую календарную реализацию, которая вам нравится, и затем используйте Range.contains.

1 голос
/ 21 сентября 2011
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;
...