一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java 判斷兩個時間段是否重疊的案例

java 判斷兩個時間段是否重疊的案例

2020-08-16 00:01SakuyaM Java教程

這篇文章主要介紹了java 判斷兩個時間段是否重疊的案例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

最近業務上遇到需要判斷兩個時間段是否存在重疊的情況,網上找了不少代碼。大佬們的思路過于簡潔了,有些理解不了。還只是個菜鳥碼農,還是多鍛煉鍛煉自己的思路。

思路很簡單:定義一個時間段的概念,既然是時間段就包含起始時間和終止時間這兩個時間點。構造方法要保證起始時間在終止時間之前,這樣才是一個有效的時間段概念。

為TimeSlot這個類定義四個比較先后順序的方法,分別為:小于、大于、小于等于、大于等于。畫張簡單的時間線圖理解一下就明白了。當整個時間段作為一個整體時,只有時間段小于或大于另一個時間段時,它們才沒有重疊的交集。

代碼如下,有什么錯誤還請各位看官幫忙指出

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
package com.abc.common.util;
 
import lombok.Data;
import org.springframework.stereotype.Component;
 
import java.time.LocalDateTime;
 
/**
 * 日期工具類
 * <p>
 *   使用LocalDateTime存取或判斷
 * </p>
 * @see java.time.LocalDateTime
 * @date 2020-6-29 10:20:42
 */
@Component
public class DateUtil {
 
  /**
   * 判斷兩個時間段是否重疊
   * @param slot1
   * @param slot2
   * @return
   */
  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));
  }
 
  /**
   * 構造一個時間段
   * @param startTime
   * @param endTime
   * @return
   */
  public static TimeSlot buildSlot(LocalDateTime startTime, LocalDateTime endTime) {
    return new TimeSlot(startTime, endTime);
  }
 
  /**
   * less equal
   * 小于等于
   * @param prev
   * @param next
   * @return
   */
  private static boolean le(TimeSlot prev, TimeSlot next) {
    return lt(prev, next) || next.endTime.isEqual(prev.startTime);
  }
 
  /**
   * greater equal
   * 大于等于
   * @param prev
   * @param next
   * @return
   */
  private static boolean ge(TimeSlot prev, TimeSlot next) {
    return gt(prev, next) || prev.endTime.isEqual(next.startTime);
  }
 
  /**
   * greater than
   * 大于
   * @param prev
   * @param next
   * @return
   */
  private static boolean gt(TimeSlot prev, TimeSlot next) {
    return prev.endTime.isBefore(next.startTime);
  }
 
  /**
   * less than
   * 小于
   * @param prev
   * @param next
   * @return
   */
  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;
      }
    }
  }
}

在業務代碼中調用:

?
1
2
3
4
5
6
7
8
// ...
 if (DateUtil.overlapped(
 DateUtil.buildSlot(beginTime, endTime),
 DateUtil.buildSlot(beginTime1, endTime1)
 )) {
 // 時間段有重疊,寫下重疊情況的業務代碼
 }
// ...

當然也可以把TimeSlot這個類拎出來,那樣或許更方便。

補充知識:Java計算Date類時間差的函數

我就廢話不多說了,大家還是直接看代碼吧~

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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 判斷兩個時間段是否重疊的案例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/SakuyaM/article/details/107022611

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 四虎国产视频 | 91搞搞| 久久亚洲国产成人影院 | 欧美在线观看视频一区 | 国产综合第一页 | 日本人和黑人一级纶理片 | 14一15sexvideo日本 | 大陆国产精品视频 | 韩国禁片在线观看久 | 亚洲大片在线观看 | 日产一区二区 | 97热在线 | 日本三级在线观看免费 | 北海市副市长黄江老公 | 亚洲视频男人的天堂 | 动漫美女人物被黄漫在线看 | 色综合网天天综合色中文男男 | 麻豆网站视频国产在线观看 | 91尤物在线播放 | 青青青国产精品国产精品美女 | 果冻传媒天美传媒乌鸦传媒 | 久久黄色精品视频 | 皇上撞着太子妃的秘密小说 | 亚洲国产AV无码综合在线 | 满城尽带黄金甲大胸片 | 天天久久影视色香综合网 | 免费一级欧美片在线观免看 | 91麻豆精品国产片在线观看 | 国产激情久久久久影院小草 | 日韩欧美国产免费看清风阁 | 91污无限制破解安卓2021 | 日本妇人成熟免费不卡片 | 不卡一区二区三区 | 91精品国产综合久 | 成人免费播放器 | 狠狠色成人综合 | 精品国产午夜久久久久九九 | 久久日本片精品AAAAA国产 | 免费看隐私男生网站 | 亚洲国产精久久久久久久 | 日本成人高清视频 |