首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以位的形式表示时间范围

如何以位的形式表示时间范围
EN

Stack Overflow用户
提问于 2012-02-21 01:36:56
回答 2查看 819关注 0票数 0

我使用按位操作来存储可用性,其中1位代表一分钟。所以一天的可用性可以用1个长度来表示(8个字节,所以64位中的60位)可以用来表示1小时,所以24个长度可以表示每天的可用性。

现在我有一系列的时间(例如,2:00 - 4:00,15:00到17:00),我需要将其转换为位掩码,以便与上面的可用性长度进行比较,以查看掩码中的范围是可用还是不可用(&使用掩码)将此时间范围转换为位的最佳方法是什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-21 01:54:02

我认为这是可行的:

代码语言:javascript
复制
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);
    }

}

结果:

代码语言:javascript
复制
false
true
true
false
false
true
false
票数 1
EN

Stack Overflow用户

发布于 2012-02-21 01:53:21

将问题简化为更简单的步骤:

  1. 将间隔(start_minute,end_minute)转换为位掩码。这可以按如下方式完成: 1a:在24个长度上迭代。1b:如果start_minute小于60,则将其转换为long。end_minute也是如此。1c:构成位掩码添加来自1<
  2. 的位以表示一系列间隔使其位掩码的"or“为
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9365707

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档