2011-07-09 19 views
6

我正在编写一个Web应用程序,允许用户参加大学课程。可以在特定的时间段内给予课程 - 时间段是一天(在一周内,即星期日,星期一等)和一小时。有固定的时间段可以提供课程。我的问题是 - 什么是实施这些时间段的最佳方式?如何在时间表中表示时间片

我以为有一个想法就是使用枚举,但后来有70个时隙。所以我想有两个枚举 - 一个星期的一个(尽管我敢打赌,这已经存在的地方 - 你知道我在哪里可以找到这种类型的现有枚举?)和一个允许的时间(例如 - 8:00 ,9:00,10:00等),并拥有一个Timeslot这两个类。

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

+0

Hi @Amir!这些时间段还包含持续时间?你为什么要实例化它们? – nick2083

+1

我只想让所有人都记住,不是每天都有24小时,每个解决方案都应该考虑到这一点。就我个人而言,我只是创建一个Timeslot类,它存储从星期一00:00开始的偏移量(如果不是所有时间段都必须是相等长度的独有的结束范围) - 似乎最简单的工作。对于输出,我们可以很容易地(很不容易,但Jodatime应该完成这项任务)计算正确的日期/时间。 – Voo

+1

并非所有事情都需要依靠JodaTime,这些日子似乎成为任何事情的答案。另外,似乎不是每天都有24小时的限制,这里并不适用。特别是因为我从来没有在所有的大学学习中见过一门课,持续时间超过5个小时(远低于整天的周期) – Woot4Moo

回答

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来从天NUMS(0-6)为字符串,反之亦然转换。在构造函数中实例化它。

-1

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

然后创建持有日,小时,分钟的TimeEdge类。 然后创建与TimeEdge类型的成员相连的类TimeSlot:开始和结束。

+0

天已经存在 – Woot4Moo

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; 
     } 
    } 
} 
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更通用,因此应该依赖组合。

+0

考虑到所有问题和日历的不易用性,我会认真推荐使用JodaTime。日历是否处理夏令时,即1:00 +2小时不一定是3:00? – Voo

0

java。时间

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

DayOfWeek

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

制作WeekTimeSlot

似乎要代表某一天的一周时间的天的一般想法。你并没有确定时间表上的具体时刻。所以你只需要一个LocalTime类的开始&停止时间。这门课没有日期,也没有时区。

我建议定义一个类至少有三个成员:

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

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

EnumMap

如果你想按周中某一天的插槽,使用EnumMapMap的这种实现经过优化,以便在键值为枚举对象时使用。您可以将DayOfWeek对象映射到List<WeekTimeSlot>

Map实现需要很少的内存和运行速度非常快。

一刻起时间表

如果您需要将这些插槽适用于特定时刻在某一天的实际时间安排,使用LocalTimeLocalDateZoneId一起获得ZonedDateTime

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