package org.kisst.util;
import java.util.Calendar;
public class TimeWindow {
private final int startHour;
private final int startMinute;
private final int endHour;
private final int endMinute;
private final int dayOfWeek;
public TimeWindow(String window) {
int pos=window.indexOf("!");
if (pos<0)
dayOfWeek=-1;
else if (pos==2) {
dayOfWeek=getDayOfWeek(window.substring(0,2));
window=window.substring(3);
}
else
throw new RuntimeException("TimeWindow may only contain two letter day of week name before exclamation mark "+window);
String[] parts=window.split("-");
if (parts.length!=2)
throw new IllegalArgumentException("time window string ["+window+"] should contain exactly one - symbol");
startHour=getHour(parts[0]);
startMinute=getMinute(parts[0]);
endHour=getHour(parts[1]);
endMinute=getMinute(parts[1]);
if (startHour>endHour)
throw new IllegalArgumentException("Time interval "+this+" should not have higher start hour than end hour");
if (startHour==endHour && startMinute>endMinute)
throw new IllegalArgumentException("Time interval "+this+" should not have higher start time than end time");
}
private int getDayOfWeek(String str) {
str=str.toLowerCase();
if ("su".equals(str)) return Calendar.SUNDAY;
if ("mo".equals(str)) return Calendar.MONDAY;
if ("tu".equals(str)) return Calendar.TUESDAY;
if ("we".equals(str)) return Calendar.WEDNESDAY;
if ("th".equals(str)) return Calendar.THURSDAY;
if ("fr".equals(str)) return Calendar.FRIDAY;
if ("sa".equals(str)) return Calendar.SATURDAY;
if ("zo".equals(str)) return Calendar.SUNDAY;
if ("ma".equals(str)) return Calendar.MONDAY;
if ("di".equals(str)) return Calendar.TUESDAY;
if ("wo".equals(str)) return Calendar.WEDNESDAY;
if ("do".equals(str)) return Calendar.THURSDAY;
if ("vr".equals(str)) return Calendar.FRIDAY;
if ("za".equals(str)) return Calendar.SATURDAY;
throw new RuntimeException("Unknown day of week "+str);
}
public String toString() { return startHour+":"+startMinute+"-"+endHour+":"+endMinute; }
public boolean isTimeInWindow(int dow, int hour, int minute) {
if (dayOfWeek>0)
if (dow!=dayOfWeek)
return false;
if (hour<startHour || hour>endHour)
return false;
if (hour>startHour || minute>=startMinute)
if (hour<endHour || minute<=endMinute)
return true;
return false;
}
private int getHour(String time) {
String[] parts=time.split(":");
if (parts.length!=2)
throw new IllegalArgumentException("time string ["+time+"] should contain exactly one : symbol");
return Integer.parseInt(parts[0].trim());
}
private int getMinute(String time) {
String[] parts=time.split(":");
if (parts.length!=2)
throw new IllegalArgumentException("time string ["+time+"] should contain exactly one : symbol");
return Integer.parseInt(parts[1].trim());
}
}