如何在计划中表示时间段

时间:2011-07-09 15:48:00

标签: java oop

我正在编写一个允许用户参加大学课程的网络应用程序。课程可以在某些时间段给出 - 时间段是一天(一周,即周日,周一等)和一小时。有固定的时间段可以提供课程。我的问题是 - 实现这些时间段的最佳方式是什么?

我曾经想到的只是使用枚举,但是有70个时隙。所以我想有两个枚举 - 一个用于工作日(虽然我打赌这已经存在于某个地方 - 你知道我在哪里可以找到这种现有的枚举吗?)和一个允许的小时数(例如 - 8:00 ,9:00,10:00等)并且Timeslot课程同时举行这两个课程。

然而,我觉得必须有一个我没有想过的更优雅的解决方案 - 你怎么看?

5 个答案:

答案 0 :(得分:1)

java.time

您正在使用现在已被java.time类取代的麻烦的旧遗留类。

DayOfWeek

java.time.DayOfWeek类是一个枚举,已经定义了七个对象,一个星期的每一天。它们按照标准ISO 8601订单编号,1-7表示周一至周日。

制作WeekTimeSlot

似乎您想要表示一周中某个时段和一天中某个时间的一般概念。你没有确定时间轴上的具体时刻。因此,您只需要一个LocalTime课程即可开始使用停止时间。这个班级缺少日期,缺少时区。

我建议定义一个至少有三个成员的课程:

您可能还想跟踪每个插槽的时间长度,而不是在运行时重复计算。

枚举适用于有限数量的对象,其值在编译时是已知的。我希望你的价值观会在不同的学期/季度在运行时变化。所以不适合枚举。

EnumMap

如果您想按周划分广告位,请使用EnumMap。 {Key {1}}的此实现已经过优化,以便在键值为枚举对象时使用。您可以将Map对象映射到DayOfWeek

这个List<WeekTimeSlot>实现只需很少的内存并且运行速度非常快。

时间轴上的时刻

如果您需要将这些广告位投放到实际时间线上特定日期的特定时刻,请使用Map以及LocalDateZoneId来获取{{} 3}}

您可能会从ZonedDateTime项目中找到有用的Interval类,这是java.time类的扩展。此类表示时间线上一对时刻之间的时间跨度。

答案 1 :(得分:0)

我个人认为单个枚举是一个完美的解决方案,虽然我同意在这种情况下它有点难看。

我可能会用这个接口实现一个类:

class ScheduledTime {
  int time;
  HashMap days<int, string>;

  Time(String day, int hour) //Inits the "time" variable with this formula: day*10 + hour - someNum.
  (someNum so that hour - someNum is 0)
  boolean compareTo()/equals(); (just compare time)
  String getDay()// Divide by 10 to get a number from 0 to 6, then just convert to sunday-monday.
  int getTime() //Mod by 10 and then add someNum.
}

使用HashMap将日期(0到6)转换为字符串,反之亦然。在构造函数中实例化它。

答案 2 :(得分:0)

Calendar类(Java API reference)具有一周中几天的常量。

如何最好地表示时间段取决于您希望此数据与应用程序的其余部分进行交互的方式。就个人而言,我会创建一个表示课程时间段的对象,并获取可用天数的int数组和起始小时的int,起始分钟的int(如果需要),结束时间的int,以及int表示构造函数中的结束分钟(如果需要)。该对象将保存一个Calendar对象列表,这些对象反映了课程每天会议的课程时间段的开始和结束时间。类似的东西:

public Class TimeSlot {
    private Calendar[] coursesStart;
    private Calenddar[] coursesEnd;

    public TimeSlot(int[] daysMeeting, int startHour, int startMinute, int endHour, int endMinute) {
        coursesStart = new Calendar[daysMeeting.length];
        coursesEnd = new Calendar[daysMeeting.length];

        for (int ctr = 0; ctr < daysMeeting.length; ctr++) {
            int courseDay = daysMeeting[ctr];

            Calendar start = new Calendar();
            start.set(Calendar.DAY_OF_WEEK, courseDay);
            start.set(Calendar.HOUR, startHour);
            start.set(Calendar.MINUTE, startMinute);

            coursesStart[ctr] = start;


            Calendar end = new Calendar();
            end.set(Calendar.DAY_OF_WEEK, courseDay);
            end.set(Calendar.HOUR, endHour);
            end.set(Calendar.MINUTE, endMinute);

            coursesEnd[ctr] = end;
        }
    }
}

答案 3 :(得分:0)

对于第一部分,Java Calendar类是您想要使用的,就星期几而言。我不会很快看到这种变化。现在对于TimeSlot也有一个小时字段的第二部分,我们将沿着这些行创建一些东西。

class TimeSlot  
{  
   Calendar classStart;  //Holds the day and the hour for the start
   Calendar classEnd;    //Holds the day and the hour for the end

  public TimeSlot(Calendar classStart, Calendar classEnd)  
  {  
    this.classStart = classStart;    
    this.classEnd = classEnd;   
  }

  public TimeSlot(Calendar classStart, int lengthOfClassInMinutes)  
  {  
    this.classStart = classStart;  
    this.classEnd = classStart;  
    classEnd.add(Calendar.MINUTE, lengthOfClassInMinutes);  
  }  

现在要说明这是如何适应宏观方案的,我们将有一个代表类的类。

public class Class  
{  
   String title;  
   Instructor instructor;  
   int sizeOfClass;  
  //rest of implementation  
}

然后是一个表示系统中预定类的类。

public class ScheduledClass  
{  
   Class classToSchedule;  
   TimeSlot classTimeSlot;  

   public ScheduledClass(Class classToSchedule, TimeSlot classTimeSlot)  
   {  
    this.classToSchedule=classToSchedule;  
    this.classTimeSlot=classTimeSlot;  
   }  
}  

在前面我反对扩展Class对象,因为看起来ScheduledClass可以更通用,因此应该依赖于组合。

答案 4 :(得分:-1)

我建议你创建3个枚举: 天(星期日,星期一等);小时(0,1,2,...,23),分钟(0,1,60);

然后创建包含日,小时,分钟的类TimeEdge。 然后创建一个类TimeSlot,它继承了TimeEdge类型的成员:start和end。