我使用按位运算来存储1位代表一分钟的可用性。因此,有一天的可用性可以表示为1长(8个字节,因此64位中的60位)可用于表示1小时,因此24个长度将表示每天的可用性。
现在我有一段时间(例如2:00-4:00,15:00到17:00)我需要将其转换为位掩码,以便与上述多个可用性进行比较,以查看范围在掩码中可用或不可用(& with mask)将这个时间范围转换为位的最佳方法是什么?
答案 0 :(得分:1)
将问题简化为更简单的步骤:
将间隔(start_minute,end_minute)转换为位掩码。这可以按如下方式完成: 1a:迭代24长。 1b:如果start_minute小于60,则将其转换为long。 end_minute也是如此。 1c:编写位掩码,添加1<
表示一系列间隔,使其“或”成为其位掩码
答案 1 :(得分:1)
我认为这有效:
private static int getMinuteOfDay(Date date) {
Calendar cal = new GregorianCalendar();
cal.setTime(date);
return cal.get(Calendar.HOUR_OF_DAY) * 60 + cal.get(Calendar.MINUTE);
}
private static void addAvailability(Date startTime, Date endTime, BitSet bs) {
int startMinute = getMinuteOfDay(startTime);
int endMinute = getMinuteOfDay(endTime);
bs.set(startMinute, endMinute);
}
private static boolean timeIsAvailable(Date time, BitSet bs) {
return bs.get(getMinuteOfDay(time));
}
static DateFormat TIME_FORMAT = new SimpleDateFormat("HH:MM:ss");
public static void main(String[] args) {
BitSet availability = new BitSet();
try {
addAvailability(TIME_FORMAT.parse("02:00:00"), TIME_FORMAT.parse("04:00:00"), availability);
addAvailability(TIME_FORMAT.parse("15:00:00"), TIME_FORMAT.parse("17:00:00"), availability);
System.out.println(timeIsAvailable(TIME_FORMAT.parse("01:19:00"), availability));
System.out.println(timeIsAvailable(TIME_FORMAT.parse("02:00:00"), availability));
System.out.println(timeIsAvailable(TIME_FORMAT.parse("02:01:00"), availability));
System.out.println(timeIsAvailable(TIME_FORMAT.parse("04:00:00"), availability));
System.out.println(timeIsAvailable(TIME_FORMAT.parse("04:01:00"), availability));
System.out.println(timeIsAvailable(TIME_FORMAT.parse("16:00:00"), availability));
System.out.println(timeIsAvailable(TIME_FORMAT.parse("17:10:00"), availability));
} catch (ParseException e) {
throw new RuntimeException(e);
}
}
结果:
false
true
true
false
false
true
false