查找小时范围是否重叠(与日期无关)

穆罕默多

我有两个小时的行程

10 PM - 02 AM
01 AM - 08 AM

我想检查它们中的任何一个是否与日期无关。

例如:第一个范围可能是8月1日和2日,而第二个范围可能是8月10日。

这就是我到目前为止

private Interval createInterval(final OpeningClosingTimesEntry entry) {
    LocalDateTime openingHour = LocalDateTime.fromDateFields(entry.getOpenTime());
    LocalDateTime closingHour = LocalDateTime.fromDateFields(entry.getCloseTime());
    if(closingHour.isBefore(openingHour)){
        closingHour = closingHour.plusDays(1);
    }
    return new Interval(openingHour.toDate().getTime(), closingHour.toDate().getTime());
}

private Interval adjustSecondIntervalDay(final Interval interval1,  final Interval interval2){
    if(interval1.getEnd().getDayOfYear() > interval2.getStart().getDayOfYear()){
        DateTime start = interval2.getStart().plusDays(1);
        DateTime end = interval2.getEnd().plusDays(1);
        return new Interval(start, end);
    }
    return interval2;
}
奥利维尔·格雷戈尔(OlivierGrégoire)

这是使用Java 8正确执行操作的方法LocalTime您询问有关Joda Time的信息,但您说使用的是Java8。在大多数情况下,Joda Time建议切换到Java 8,这种情况也不例外。

由于您不在乎日期,而只是想知道时间是否重叠,因此您不应该使用诸如LocalDateLocalDateTime,而是使用LocalTime

为了解决您的问题,我创建了isBetween一种方法,方法检查两个有序时间(一天中的某天)是否包含第三次时间,即使您传递到第二天也是如此。因此,例如21小时介于18小时和6小时之间。

然后,一旦有了该实用程序方法,只需检查两个范围中的至少一个是否包含另一个范围的边界即可。

我让您自行决定范围(例如1-2-2-3)。您拥有通用算法,其余部分则由您自己决定。

package so38810914;

import java.time.LocalTime;
import static java.util.Objects.*;

public class Question {

    public static class LocalTimeRange {

        private final LocalTime from;
        private final LocalTime to;

        public LocalTimeRange(LocalTime from, LocalTime to) {
            requireNonNull(from, "from must not be null");
            requireNonNull(to, "to must not be null");
            this.from = from;
            this.to = to;
        }

        public boolean overlaps(LocalTimeRange other) {
            requireNonNull(other, "other must not be null");
            return isBetween(other.from, this.from, this.to)
                    || isBetween(other.to, this.from, this.to)
                    || isBetween(this.from, other.from, other.to)
                    || isBetween(this.to, other.from, other.to);
        }

        private static boolean isBetween(LocalTime t, LocalTime from, LocalTime to) {
            if (from.isBefore(to)) { // same day
                return from.isBefore(t) && t.isBefore(to);
            } else { // spans to the next day.
                return from.isBefore(t) || t.isBefore(to);
            }
        }
    }

    public static void main(String[] args) {
        test( 0,  1,     2,  3,    false);
        test( 2,  3,     0,  1,    false);
        test( 0,  3,     1,  2,    true);
        test( 1,  2,     0,  3,    true);
        test( 0,  2,     1,  3,    true);
        test(12, 18,    15, 21,    true);
        test(18,  6,    21,  3,    true);
        test(21,  3,     0,  6,    true);
        test(21,  0,     3,  6,    false);

    }

    private static void test(int from1, int to1, int from2, int to2, boolean overlap) {
        LocalTimeRange range1 = new LocalTimeRange(LocalTime.of(from1, 0), LocalTime.of(to1, 0));
        LocalTimeRange range2 = new LocalTimeRange(LocalTime.of(from2, 0), LocalTime.of(to2, 0));
        boolean test = (range1.overlaps(range2)) == overlap;
        System.out.printf("[%2d-%2d] - [%2d-%2d] -> %-5b: %s%n", from1, to1, from2, to2, overlap, test?"OK":"Not OK");
    }
}

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

查找与日期范围相比缺少的日期

来自分类Dev

在SQL中查找日期范围重叠的记录

来自分类Dev

检查给定时间是否介于两次之间,与日期无关

来自分类Dev

PHP检查时间是否介于两次之间(与日期无关)

来自分类Dev

确定输入日期范围是否与现有日期范围重叠

来自分类Dev

确定输入日期范围是否与现有日期范围重叠

来自分类Dev

从 2 个重叠的日期时间范围获取小时数

来自分类Dev

查找日期从现在起一分钟之内但与日期无关的条目

来自分类Dev

查找日期是否在N对列表中重叠

来自分类Dev

从与日期无关的MySQL日期时间字段中选择

来自分类Dev

在两个表中查找重叠的日期范围

来自分类Dev

查找重叠的日期范围,并添加相应的效果指标以衡量效率

来自分类Dev

Django按时间过滤datetime字段,与日期无关

来自分类Dev

MySQL-DATETIME大于给定时间,与日期无关

来自分类Dev

多次重叠的日期范围

来自分类Dev

检查是否有两个以上的日期范围重叠

来自分类Dev

MySQL检查两个日期范围是否与输入重叠

来自分类Dev

检查是否有两个以上的日期范围重叠

来自分类Dev

确定2个日期范围是否重叠excel

来自分类Dev

MySQL名称利润与日期范围

来自分类Dev

HTML 日期选择器与日期输入重叠

来自分类Dev

PHP的日期时间与日期没有小时

来自分类Dev

查找日期时间之间是否经过了24小时

来自分类Dev

MongoDB-检查日期范围A是否与其他日期范围b重叠

来自分类Dev

两个日期范围之间有多少小时重叠

来自分类Dev

PHP:查找预订日期是否在指定的日期范围内

来自分类Dev

使用 XSLT 查找日期是否在日期范围内

来自分类Dev

给定日期范围,查找在该范围内重叠的事件

来自分类Dev

MongoDB查找日期范围(如果与其他日期重叠)

Related 相关文章

  1. 1

    查找与日期范围相比缺少的日期

  2. 2

    在SQL中查找日期范围重叠的记录

  3. 3

    检查给定时间是否介于两次之间,与日期无关

  4. 4

    PHP检查时间是否介于两次之间(与日期无关)

  5. 5

    确定输入日期范围是否与现有日期范围重叠

  6. 6

    确定输入日期范围是否与现有日期范围重叠

  7. 7

    从 2 个重叠的日期时间范围获取小时数

  8. 8

    查找日期从现在起一分钟之内但与日期无关的条目

  9. 9

    查找日期是否在N对列表中重叠

  10. 10

    从与日期无关的MySQL日期时间字段中选择

  11. 11

    在两个表中查找重叠的日期范围

  12. 12

    查找重叠的日期范围,并添加相应的效果指标以衡量效率

  13. 13

    Django按时间过滤datetime字段,与日期无关

  14. 14

    MySQL-DATETIME大于给定时间,与日期无关

  15. 15

    多次重叠的日期范围

  16. 16

    检查是否有两个以上的日期范围重叠

  17. 17

    MySQL检查两个日期范围是否与输入重叠

  18. 18

    检查是否有两个以上的日期范围重叠

  19. 19

    确定2个日期范围是否重叠excel

  20. 20

    MySQL名称利润与日期范围

  21. 21

    HTML 日期选择器与日期输入重叠

  22. 22

    PHP的日期时间与日期没有小时

  23. 23

    查找日期时间之间是否经过了24小时

  24. 24

    MongoDB-检查日期范围A是否与其他日期范围b重叠

  25. 25

    两个日期范围之间有多少小时重叠

  26. 26

    PHP:查找预订日期是否在指定的日期范围内

  27. 27

    使用 XSLT 查找日期是否在日期范围内

  28. 28

    给定日期范围,查找在该范围内重叠的事件

  29. 29

    MongoDB查找日期范围(如果与其他日期重叠)

热门标签

归档