【发布时间】:2018-07-22 14:08:12
【问题描述】:
我有许多时间戳 (start, end),它们定义了一个间隔,并希望有效地检查它们是否与另一个单个间隔重叠。如果是,则计算重叠持续时间,否则返回 0。
时间间隔:同一天18:00 直到第二天08:00。
start | end
2018-01-02 14:59:18.922|2018-01-02 14:59:38.804
2018-01-02 18:32:59.348|2018-01-02 20:30:41.192
2018-01-02 01:54:59.363|2018-01-02 01:54:59.363
2018-01-03 00:10:38.831|2018-01-03 00:11:53.103
我不确定如何有效地定义第二天。
编辑
LocalDate
有一个方法toInterval().overlaps(anotherInterval)。我只是不确定如何以 generic 方式获得拟合间隔(18:00 - 第二天 08:00),即无需手动读取 YYYMMDD 然后创建一个新对象。
编辑 2
toInterval 仅存在于 jodatime - 不是 java.time / JSR-310。用 java.time 计算重叠持续时间的可行方法是什么?
编辑3
jodaTime 的解决方案:
val begin = new DateTime(new java.sql.Timestamp().getTime())
val stop = new DateTime(new java.sql.Timestamp().getTime())
val i1 = new Interval(begin, stop)
val start = new DateTime(begin.year.get , begin.monthOfYear.get, begin.dayOfMonth.get, startHour, 0, 0, 0);
val endIntermediate =stop.toDateTime.plusDays(1)
val end = new DateTime(endIntermediate.year.get , endIntermediate.monthOfYear.get, endIntermediate.dayOfMonth.get, endHour, 0, 0, 0);
val i2 = new Interval(start, end)
val overlap = i1.overlap(i2)
val overlapDurationOrNull = overlap.toDuration
似乎有效,但仍然很笨拙。
【问题讨论】:
-
这个有点不清楚。
interval: 18:00 same day until 08:00 the next day是要针对表中所有时段检查重叠的输入“间隔”吗? -
对于上面示例中的每个条目,我想检查一个时间间隔 (18:00-08:00)。如果有任何重叠,计算重叠持续时间。
-
如何以通用方式获得拟合间隔(18:00 - 次日 08:00) 这究竟是什么意思?你的输入是什么,你的预期输出是什么?和什么同一天?第二天是什么?
-
我的意思是我不想从开始结束间隔中提取
yyMMdd(即日期),然后手动实例化一个具有合适日期和 18:00 和秒的新对象具有下一个日期和 08:00 的对象,但以对任何输入日期都有效的方式定义 18:00-08:00。
标签: java time intervals overlap duration