“办公时间”与jodatime,如何存储在数据库中

时间:2014-03-18 22:18:20

标签: java hibernate datetime hibernate-mapping jodatime

我正在考虑存储一组"工作/办公时间"对于一周中的每一天,即 周一至周五 星期二 - 8.30至16.30 ... 坐在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更快。但在这两种情况下,我最终都不得不手动创建间隔。

有没有办法存储"日期不可知的"数据库中的间隔,然后我可以更改我按上述计算时的日期?

如果有人通过这个并且有任何指示,我会非常感激。

1 个答案:

答案 0 :(得分:0)

您可以将两个值workShift.getStartMillis()workShift.getEndillis()(在Java中返回long)保存到数据库中,作为big int类型的两个字段。

如果您希望稍后在代码中将它们分开,可以将这两个值保存为;分隔的文本字段。

如果您希望稍后自己应用该毫秒数而不是创建Joda时间workShift.toDurationMillis(),那么您也可以将big int存储在数据库中Interval(因为有没有将持续时间设为long)的构造函数。