最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java如何判斷時(shí)間段是否交叉重疊

 更新時(shí)間:2023年12月21日 15:41:31   作者:王素健  
這篇文章主要介紹了java如何判斷時(shí)間段是否交叉重疊問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1.需求

要求保存每一條數(shù)據(jù)的startTime、endTime的中間時(shí)間段是唯一的,跟其他數(shù)據(jù)時(shí)間段不能存在沖突

比如:

(2019-03-01 -> 2019-03-03 ) (2019-03-02 -> 2019-03-04 )

這兩個(gè)時(shí)間段存在重疊部分

2.思路

首先,校驗(yàn)前端傳的list自身先比較是否有時(shí)間沖突;

然后,校驗(yàn)前端List跟數(shù)據(jù)庫(kù)存在的list是否有時(shí)間沖突;

方法:兩次for循環(huán)list實(shí)現(xiàn)

3.代碼部分

*實(shí)體類*

/**
 * @Param:
 * @Description: 實(shí)體類
 * @Author: zyf    2019/3/29
 */
class TimeModel {
    private Long jobId; //主鍵
    private Date startTime;//開(kāi)始時(shí)間
    private Date endTime;   //結(jié)束時(shí)間
    //getter/setter
}

*前端顯示日期格式*

public static final String DATE_FORMAT_Y_M_DHM = "yyyy-MM-dd HH:mm"; //比較日期計(jì)算到分鐘,當(dāng)然數(shù)據(jù)庫(kù)里面存的數(shù)據(jù)一般精確到秒
// date轉(zhuǎn)String
    public static String dateToStr(Date date) {
        String strDate = "";
        SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_Y_M_DHM);
        strDate = sdf.format(date);
        return strDate;
    }

前端List數(shù)據(jù)校驗(yàn)(自身)

 /**
     * @Param:
     * @Description: list自身查詢有無(wú)時(shí)間沖突,
     * 優(yōu)化1: 如果自身的list過(guò)大, j遍歷不能從0開(kāi)始,只需要往后面數(shù)據(jù)比較大小
     * @Author: zyf    2019/3/29
     */
    public static String checkSelf(List<TimeModel> list) {
        String res = null;
        if (list.size() == 0) {
            return res;
        }
        for (int i = 0; i < list.size(); i++) {
            // long I_S = list.get(i).getEffectiveStartTime().getTime();
            // long I_E = list.get(i).getEffectiveEndTime().getTime();
            Date I_S = list.get(i).getStartTime();
            Date I_E = list.get(i).getEndTime();
           // for (int j = 0; j < list.size(); j++) {
            for (int j = i+1; j < list.size(); j++) {
               /* if (i == j) {
                    continue;  //自身不跟自身比較
                }*/
                Date J_S = list.get(j).getStartTime();
                Date J_E = list.get(j).getEndTime();
                //這里使用compareTo方法, 因?yàn)間etTime()的時(shí)間不太準(zhǔn)確
                if ((J_S.compareTo(I_S) == -1 && I_S.compareTo(J_E) == -1)
                        || (J_S.compareTo(I_E) == -1 && I_E.compareTo(J_E) == -1)
                || (I_S.compareTo(J_S) == -1 && J_S.compareTo(I_E) == -1)   //新加部分
                || (I_S.compareTo(J_E) == -1 && J_E.compareTo(I_E) == -1)   //新加部分

|| J_E.compareTo(I_S) == 0 || J_S.compareTo(I_E) == 0
                        || J_E.compareTo(I_E) == 0 || J_S.compareTo(I_S) == 0) {
                    res =  dateToStr(list.get(i).getStartTime()) + " "
                            + dateToStr(list.get(i).getEndTime());
                    break;
                }
            }
        }
        return res;
    }

前端list和數(shù)據(jù)庫(kù)存在數(shù)據(jù)list比較

/**
     * @Param: listNew 前端傳的list
     * @Param: listOld 數(shù)據(jù)庫(kù)list,
     * 優(yōu)化2*****后端查詢數(shù)據(jù)庫(kù)可以根據(jù)前端的list里面最大時(shí)間和最小時(shí)間區(qū)間作為條件查詢出來(lái)
     * @Description: 比較前端傳的list跟數(shù)據(jù)庫(kù)list有無(wú)時(shí)間沖突
     * @Author: zyf    2019/3/29
     */
    public static String checkTwoList(List<TimeModel> listNew, List<TimeModel> listOld) {
        String res = null;  //沒(méi)有沖突返回null,有沖突返回沖突的時(shí)間段
        for (int i = 0; i < listNew.size(); i++) {
            Date I_S = listNew.get(i).getStartTime();
            Date I_E = listNew.get(i).getEndTime();
            Long jobIdNew = listNew.get(i).getJobId();
            for (int j = 0; j < listOld.size(); j++) {
                Long jobIdOld = listOld.get(j).getJobId();
                Date J_S = listOld.get(j).getStartTime();
                Date J_E = listOld.get(j).getEndTime();

                if (jobIdNew != null && jobIdNew.longValue() == jobIdOld.longValue()) {
                    continue; // 前臺(tái)如果是舊數(shù)據(jù)修改不能再跟自己比較
                }
                //compareTo返回結(jié)果-1 0 1 表示前者比后者<,=,>關(guān)系 ,下面的if判斷涉及具體的怎樣比較可以自行優(yōu)化
                if ((J_S.compareTo(I_S) == -1 && I_S.compareTo(J_E) == -1)
                        || (J_S.compareTo(I_E) == -1 && I_E.compareTo(J_E) == -1)                        || (I_S.compareTo(J_S) == -1 && J_S.compareTo(I_E) == -1)   //新加部分                || (I_S.compareTo(J_E) == -1 && J_E.compareTo(I_E) == -1)   //新加部分
                        || J_E.compareTo(I_S) == 0 || J_S.compareTo(I_E) == 0
                        || J_E.compareTo(I_E) == 0 || J_S.compareTo(I_S) == 0) {
                    res = dateToStr(listNew.get(i).getStartTime()) + " "
                            + dateToStr(listNew.get(i).getEndTime());
                    break;
                }
            }
        }
        return res;
    }

測(cè)試

//測(cè)試
    @Test
    public void test01() {

        /*
        * 這里模擬一下數(shù)據(jù)庫(kù)存儲(chǔ)的時(shí)間格式,精確到秒,實(shí)際情況直接進(jìn)行比較的是Date類型
        * 注意:時(shí)間點(diǎn)不能相等
        * */
        //model1 的開(kāi)始-結(jié)束時(shí)間  2019-03-01 14:51:00  2019-03-05 14:52:00
        //model2 的開(kāi)始-結(jié)束時(shí)間  2019-03-05 14:53:00  2019-03-05 14:54:00
        //model3 的開(kāi)始-結(jié)束時(shí)間  2019-03-02 14:53:00  2019-03-05 14:53:00

        List<TimeModel> list = new ArrayList<>();
        List<TimeModel> listOld = new ArrayList<>();
        TimeModel mode1 = new TimeModel();
        mode1.setStartTime(strToDate("2019-03-01 14:51:00"));
        mode1.setEndTime(strToDate("2019-03-05 14:52:00"));

        TimeModel mode2 = new TimeModel();
        //mode2.setStartTime(strToDate("2019-03-05 14:51:00"));  //checkSelf()使用
        mode2.setStartTime(strToDate("2019-03-05 14:53:00")); //checkTwoList()使用
        mode2.setEndTime(strToDate("2019-03-05 14:54:00"));

        TimeModel mode3 = new TimeModel();
        mode3.setStartTime(strToDate("2019-03-02 14:53:00"));
        mode3.setEndTime(strToDate("2019-03-05 14:58:00"));

        list.add(mode1);
        list.add(mode2);

        //String res = checkSelf(list);  //checkSelf()使用

        listOld.add(mode3);  //checkTwoList()使用
        String res = checkTwoList(list,listOld);
        System.out.println("沖突的時(shí)間段:"  + res);

    }

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 如何在Java SpringBoot項(xiàng)目中配置動(dòng)態(tài)數(shù)據(jù)源你知道嗎

    如何在Java SpringBoot項(xiàng)目中配置動(dòng)態(tài)數(shù)據(jù)源你知道嗎

    這篇文章主要介紹了SpringBoot如何在運(yùn)行時(shí)動(dòng)態(tài)添加數(shù)據(jù)源,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-09-09
  • mybatis查詢SqlServer慢問(wèn)題及解決

    mybatis查詢SqlServer慢問(wèn)題及解決

    這篇文章主要介紹了mybatis查詢SqlServer慢問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Java線性表的順序表示及實(shí)現(xiàn)

    Java線性表的順序表示及實(shí)現(xiàn)

    這篇文章主要介紹了Java線性表的順序表示及實(shí)現(xiàn),順序表是在計(jì)算機(jī)內(nèi)存中以數(shù)組的形式保存的線性表,線性表的順序存儲(chǔ)是指用一組地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)線性表中的各個(gè)元素、使得線性表中在邏輯結(jié)構(gòu)上相鄰的數(shù)據(jù)元素存儲(chǔ)在相鄰的物理存儲(chǔ)單元中
    2022-07-07
  • Spring?Boot?項(xiàng)目在?K8S?中的打包、部署與運(yùn)維發(fā)布實(shí)踐指南

    Spring?Boot?項(xiàng)目在?K8S?中的打包、部署與運(yùn)維發(fā)布實(shí)踐指南

    文章介紹了運(yùn)維工程師掌握SpringBoot+Docker+K8S+JVM的基礎(chǔ)知識(shí)和發(fā)布流程,包括Java項(xiàng)目的交付物、SpringBoot構(gòu)建流程、Jenkins流水線發(fā)布、JVM配置和優(yōu)化等,幫助運(yùn)維理解從源碼到上線的完整交付視角,提升發(fā)布成功率和故障排查能力,感興趣的朋友一起看看吧
    2026-05-05
  • SpringSecurity顯示用戶賬號(hào)已被鎖定的原因及解決方案

    SpringSecurity顯示用戶賬號(hào)已被鎖定的原因及解決方案

    SpringSecurity中用戶賬號(hào)被鎖定問(wèn)題源于UserDetails接口方法返回值錯(cuò)誤,解決方案是修正isAccountNonLocked()等方法的邏輯,確保返回正確狀態(tài),避免誤判賬戶鎖定,從而允許合法用戶登錄,下面給大家介紹SpringSecurity顯示用戶賬號(hào)已被鎖定的解決方案,感興趣的朋友一起看看吧
    2025-06-06
  • Java中自動(dòng)裝箱、拆箱引起的耗時(shí)詳解

    Java中自動(dòng)裝箱、拆箱引起的耗時(shí)詳解

    這篇文章主要給大家介紹了關(guān)于Java中自動(dòng)裝箱、拆箱引起的耗時(shí)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • 通過(guò)JDK源碼角度分析Long類詳解

    通過(guò)JDK源碼角度分析Long類詳解

    這篇文章主要給大家介紹了關(guān)于通過(guò)JDK源碼角度分析Long類的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用long類具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-11-11
  • Java代碼實(shí)現(xiàn)從HTML文件中提取純文本內(nèi)容

    Java代碼實(shí)現(xiàn)從HTML文件中提取純文本內(nèi)容

    在?Java?數(shù)據(jù)處理、文本清洗、內(nèi)容解析等開(kāi)發(fā)場(chǎng)景中,從?HTML?文件中剔除標(biāo)簽、樣式、腳本等冗余格式,提取核心純文本是高頻需求,下面我們就來(lái)看看如何使用Java實(shí)現(xiàn)從HTML文件中提取純文本內(nèi)容吧
    2026-04-04
  • SpringBoot項(xiàng)目啟動(dòng)錯(cuò)誤:找不到或無(wú)法加載主類的三種解決方法

    SpringBoot項(xiàng)目啟動(dòng)錯(cuò)誤:找不到或無(wú)法加載主類的三種解決方法

    在開(kāi)發(fā)SpringBoot應(yīng)用時(shí),經(jīng)??赡軙?huì)遇到一個(gè)啟動(dòng)錯(cuò)誤:“錯(cuò)誤:找不到或無(wú)法加載主類 com.example.controller.demo.DemoApplication”,本文將介紹三種解決這一問(wèn)題的方法,需要的朋友可以參考下
    2024-10-10
  • java編程枚舉類型那些事!枚舉類型定義和重寫枚舉的方法

    java編程枚舉類型那些事!枚舉類型定義和重寫枚舉的方法

    本文主要介紹了枚舉類型的有關(guān)內(nèi)容,涉及簡(jiǎn)單的枚舉類型定義,以及枚舉類型的值在Java中的定義方法,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10

最新評(píng)論

新沂市| 稷山县| 漠河县| 绵阳市| 泽普县| 哈尔滨市| 永修县| 西吉县| 临潭县| 巴南区| 昌图县| 江油市| 墨玉县| 黄浦区| 天门市| 巴东县| 琼结县| 津南区| 抚远县| 峡江县| 慈溪市| 葫芦岛市| 荥经县| 宁德市| 榆树市| 泸水县| 旬阳县| 宜春市| 铁岭县| 栾城县| 金堂县| 石阡县| 巴中市| 富阳市| 横山县| 云龙县| 仁化县| 长海县| 冷水江市| 普定县| 河间市|