我正在考虑为每周的每一天存储一组"工作/办公时间",即:周一——朝九晚五周二- 8点半到16点半…星期六10:00至14:00等。
在服务层中使用Jodatime,我将使用这些值来计算特定间隔的哪些部分属于办公时间,哪些部分不属于办公时间。
在我看来,最好的计算方法是使用区间的重叠函数,正如下面这个快速组合的例子所示: LocalTime startOfficeHours = new LocalTime(9, 30);
LocalTime endOfficeHours = new LocalTime(17, 30);
Interval officeHoursToday = new Interval(startOfficeHours.toDateTimeToday(), endOfficeHours.toDateTimeToday());
DateTime start = new DateTime().withHourOfDay(8).withMinuteOfHour(30);
DateTime end = start.plusHours(7).plusMinutes(45);
Interval workShift = new Interval(start, end);
Period withinOfficeHours = officeHoursToday.overlap(workShift).toPeriod();
assertEquals(withinOfficeHours.getHours(), 6);
assertEquals(withinOfficeHours.getMinutes(), 45);
现在,我需要找到一种方法来读取和写入这些办公时间间隔的数据库在一个快速的方式…
如果我只使用整数,那将是28列-但这可能比写入和读取可能包含大量冗余信息的PersistentLocalTimes更快。但在这两种情况下,我最终不得不手动创建时间间隔。
是否有一种方法可以在数据库中存储一个"日期无关"的间隔,然后我可以更改日期,当我按照上面的计算?
如果有人读过这篇文章并有任何建议,我将不胜感激。
您可以将两个值workShift.getStartMillis()
和workShift.getEndillis()
(在Java中返回long
)保存到数据库中,作为big int
类型的两个字段。
您可以将这两个值保存为;
分隔的文本字段,如果您想在以后的代码中分开它们。
您也可以将workShift.toDurationMillis()
作为big int
存储在数据库中,如果您希望稍后自己应用该毫秒数的添加,而不是创建Joda Time Interval
(因为没有构造函数将持续时间作为long
)。