java时间戳用间隔计算重叠持续时间

乔治·海勒

我有许多时间戳 ( 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)我只是不确定如何以通用方式获得拟合间隔(18:00 - 第二天 08:00),即无需手动读取YYYMMDD然后创建新对象。

编辑 2

toInterval仅适用于 jodatime - 不适用于java.time/ JSR-310。用 java.time 计算重叠持续时间的可行方法是什么?

https://stackoverflow.com/questions/325933/determine-whether-two-date-ranges-overlap

编辑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

似乎工作,但仍然很笨拙。

奥莱VV

我相信以下方法为您提供了相当于您的 Joda-Time 解决方案。

private static final LocalTime START = LocalTime.of(18, 0);
private static final LocalTime END = LocalTime.of(8, 0);

public static Duration overlap(ZonedDateTime currentStart, ZonedDateTime currentEnd) {
    ZonedDateTime singleIntervalStart = currentStart.with(START);
    ZonedDateTime singleIntervalEnd = currentStart.plusDays(1).with(END);
    if (currentEnd.isBefore(singleIntervalStart)) {
        // no overlap
        return Duration.ZERO;
    }
    ZonedDateTime overlapStart = currentStart.isBefore(singleIntervalStart)
            ? singleIntervalStart : currentStart;
    ZonedDateTime overlapEnd = currentEnd.isBefore(singleIntervalEnd)
            ? currentEnd : singleIntervalEnd;
    return Duration.between(overlapStart, overlapEnd);
}

为了使用您问题中的时间戳进行尝试,我使用了以下实用方法:

private static void demo(String from, String to) {
    ZoneId zone = ZoneId.of("Atlantic/Stanley");
    Duration overlapDuration = overlap(LocalDateTime.parse(from).atZone(zone),
            LocalDateTime.parse(to).atZone(zone));
    System.out.println("" + from + " - " + to + ": " + overlapDuration);
}

现在我这样称呼它:

    demo("2018-01-02T14:59:18.922", "2018-01-02T14:59:38.804");
    demo("2018-01-02T18:32:59.348", "2018-01-02T20:30:41.192");
    demo("2018-01-02T01:54:59.363", "2018-01-02T01:54:59.363");
    demo("2018-01-03T00:10:38.831", "2018-01-03T00:11:53.103");

输出是:

2018-01-02T14:59:18.922 - 2018-01-02T14:59:38.804: PT0S
2018-01-02T18:32:59.348 - 2018-01-02T20:30:41.192: PT1H57M41.844S
2018-01-02T01:54:59.363 - 2018-01-02T01:54:59.363: PT0S
2018-01-03T00:10:38.831 - 2018-01-03T00:11:53.103: PT0S

在第一个示例中,14:59 是在 18:00 之前,因此结果是重叠为 0。在第二个示例中,整个时间间隔都计为重叠(近 2 小时)。请注意,在最后两个示例中,没有报告重叠,因为时间是 18:00 之前的许多小时。我不确定这是否是您想要的,因为时间也在 08:00 之前。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

python时间间隔重叠持续时间

来自分类Dev

获取重叠间隔的持续时间

来自分类Dev

计算MySQL中时间重叠的重叠持续时间

来自分类Dev

计算重叠时间段的持续时间

来自分类Dev

perl:计算时间戳之间的持续时间

来自分类Dev

用条件计算日期持续时间

来自分类Dev

queryUsageStats间隔持续时间

来自分类Dev

事件的总持续时间,可能存在的差距和时间间隔重叠

来自分类Dev

计算持续时间(年龄)

来自分类Dev

计算日期持续时间

来自分类Dev

计算夜班持续时间

来自分类Dev

用熊猫数据框计算状态的持续时间

来自分类Dev

计算总体锻炼时间的“持续时间”

来自分类Dev

最大重叠事件的持续时间

来自分类Dev

算法-查找循环世界中重叠间隔的持续时间(24小时)

来自分类Dev

根据条件获取日期间隔之间的重叠持续时间

来自分类Dev

用Java解析持续时间的最干净方法

来自分类Dev

日期持续时间/日期减法计算

来自分类Dev

计算甘特图的总持续时间

来自分类Dev

如何计算表格中的持续时间

来自分类Dev

计算数据集的持续时间

来自分类Dev

在2列中计算持续时间

来自分类Dev

计算复杂表中的持续时间

来自分类Dev

从行计算SQLite持续时间

来自分类Dev

如何计算表格中的持续时间

来自分类Dev

计算数据集的持续时间

来自分类Dev

如何根据时间戳值过滤持续时间

来自分类Dev

使用Tableau的集合中多个时间戳的持续时间

来自分类Dev

如何计算以每个日期的持续时间和15分钟的间隔记录的用户