栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java 判断两个时间段是否重叠的案例

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java 判断两个时间段是否重叠的案例

最近业务上遇到需要判断两个时间段是否存在重叠的情况,网上找了不少代码。大佬们的思路过于简洁了,有些理解不了。还只是个菜鸟码农,还是多锻炼锻炼自己的思路。

思路很简单:定义一个时间段的概念,既然是时间段就包含起始时间和终止时间这两个时间点。构造方法要保证起始时间在终止时间之前,这样才是一个有效的时间段概念。

为TimeSlot这个类定义四个比较先后顺序的方法,分别为:小于、大于、小于等于、大于等于。画张简单的时间线图理解一下就明白了。当整个时间段作为一个整体时,只有时间段小于或大于另一个时间段时,它们才没有重叠的交集。

代码如下,有什么错误还请各位看官帮忙指出

package com.abc.common.util;

import lombok.Data;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;


@Component
public class DateUtil {

  
  public static boolean overlapped(TimeSlot slot1, TimeSlot slot2) {
    TimeSlot previous, next;
    previous = slot1.startTime.isBefore(slot2.startTime) ? slot1 : slot2;
    next = slot2.startTime.isAfter(slot1.startTime) ? slot2 : slot1;
    // 这里业务需要,允许时间点的重叠
    // 例如某个时间段的起始时间:2020-06-29 00:00:00
    // 和另一个时间段的终止时间:2020-06-29 00:00:00
    // 它们俩可以有交点。如果不需要这种逻辑只把le改成lt
    // ,ge改成gt就可
    return !(le(previous, next) || ge(previous, next));
  }

  
  public static TimeSlot buildSlot(LocalDateTime startTime, LocalDateTime endTime) {
    return new TimeSlot(startTime, endTime);
  }

  
  private static boolean le(TimeSlot prev, TimeSlot next) {
    return lt(prev, next) || next.endTime.isEqual(prev.startTime);
  }

  
  private static boolean ge(TimeSlot prev, TimeSlot next) {
    return gt(prev, next) || prev.endTime.isEqual(next.startTime);
  }

  
  private static boolean gt(TimeSlot prev, TimeSlot next) {
    return prev.endTime.isBefore(next.startTime);
  }

  
  private static boolean lt(TimeSlot prev, TimeSlot next) {
    return next.endTime.isBefore(prev.startTime);
  }

  
  @Data
  static class TimeSlot{
    private LocalDateTime startTime;
    private LocalDateTime endTime;

    public TimeSlot(LocalDateTime startTime, LocalDateTime endTime) {
      if (startTime.isAfter(endTime)) {
 this.startTime = endTime;
 this.endTime = startTime;
      } else {
 this.startTime = startTime;
 this.endTime = endTime;
      }
    }
  }
}

在业务代码中调用:

// ...
 if (DateUtil.overlapped(
 DateUtil.buildSlot(beginTime, endTime),
 DateUtil.buildSlot(beginTime1, endTime1)
 )) {
 // 时间段有重叠,写下重叠情况的业务代码
 }
// ...

当然也可以把TimeSlot这个类拎出来,那样或许更方便。

补充知识:Java计算Date类时间差的函数

我就废话不多说了,大家还是直接看代码吧~

 public static String TimeDifference(long start, long end) {
 
    long between = end - start;
    long day = between / (24 * 60 * 60 * 1000);
    long hour = (between / (60 * 60 * 1000) - day * 24);
    long min = ((between / (60 * 1000)) - day * 24 * 60 - hour * 60);
    long s = (between / 1000 - day * 24 * 60 * 60 - hour * 60 * 60 - min * 60);
    long ms = (between - day * 24 * 60 * 60 * 1000 - hour * 60 * 60 * 1000
 - min * 60 * 1000 - s * 1000);
    String timeDifference = day + "天" + hour + "小时" + min + "分" + s + "秒" + ms
 + "毫秒";
    return timeDifference;
  }

以上这篇java 判断两个时间段是否重叠的案例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持考高分网。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/132590.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号