当前位置: 代码网 > it编程>编程语言>Javascript > 如何在js中计算两个时间段重叠的时长问题详解

如何在js中计算两个时间段重叠的时长问题详解

2024年05月26日 Javascript 我要评论
前言最近遇到一个需求,就是在js中计算两段时间的重叠时长问题,这里记录一下。一、过程分析两段时间的重叠问题,一般有3中情况两段时间完全无重叠,也就是无任何交集两段时间有交叉两段时间有包含关系为了弄清楚

前言

最近遇到一个需求,就是在js中计算两段时间的重叠时长问题,这里记录一下。

一、过程分析

两段时间的重叠问题,一般有3中情况

  • 两段时间完全无重叠,也就是无任何交集
  • 两段时间有交叉
  • 两段时间有包含关系

为了弄清楚这个关系,我画了一张图来说明:

根据这张图上的内容,我们可以按照步骤来逐个实现。

  • 第一种情况,明显没有重叠,所以为0
  • 第二种情况,交叉情况下可能的结果是:end1-start2或者end2-start1
  • 第三种情况,包含关系下可能的结果是:end2-start2或者end1-start1

根据上面的分析,我们可以直接写代码

二、实现代码(js)

javascript处理日期我推荐一个插件库【moment.js】点击官网

使用这个工具我们就能很轻松处理日期的各种操作。代码如下:

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>title</title>
    <script src="https://cdn.bootcdn.net/ajax/libs/moment.js/2.29.4/moment.min.js"></script>
</head>
<body>
<script>
    //两个时间段重复的时段,返回秒数
    //传入两个数组
    function bw(times1,times2){
        if(!array.isarray(times1) || !array.isarray(times2) || times1.length!=2 || times2.length!=2){
            console.log('参数错误1')
            return 0;
        }
        var start1=moment(times1[0]);
        var end1=moment(times1[1]);
        var start2=moment(times2[0]);
        var end2=moment(times2[1]);

        if(!start1.isvalid() || !end1.isvalid() || !start2.isvalid() || !end2.isvalid()){
            console.log('参数错误2')
            return 0;
        }

        //先判断数据正确性
        if(start1.isafter(end1) || start2.isafter(end2)){
            console.log('时间范围不正确')
            return 0;
        }
        //第一种情况
        if(end1.issameorbefore(start2) || end2.issameorbefore(start1)) {
            console.log('两段时间无交叉')
            return 0;
        }
        //第二种情况:1,这种情况就是end1-start2
        if(start1.issameorbefore(start2) && end1.issameorbefore(end2) && start2.issameorbefore(end1)){
            var duration = moment.duration(end1.diff(start2))
            //duration.as('hours');
            //duration.as('minutes');
            //duration.as('seconds');
            //duration.as('milliseconds');
            console.log('交叉情况1')
            return duration.as('seconds')
        }
        //第二种情况:2,这种情况就是end2-start1
        if(start2.issameorbefore(start1) && end2.issameorbefore(end1) && start1.issameorbefore(end2)){
            var duration = moment.duration(end2.diff(start1))
            //duration.as('hours');
            //duration.as('minutes');
            //duration.as('seconds');
            //duration.as('milliseconds');
            console.log('交叉情况2')
            return duration.as('seconds')
        }
        //第三种情况:1,time1包含time2 这是就是:end2-start2
        if(start1.issameorbefore(start2) && end2.issameorbefore(end1)){
            var duration = moment.duration(end2.diff(start2))
            //duration.as('hours');
            //duration.as('minutes');
            //duration.as('seconds');
            //duration.as('milliseconds');
            console.log('包含情况1')
            return duration.as('seconds')
        }
         //第三种情况:2,time2包含time1 这是就是:end1-start1
        if(start2.issameorbefore(start1) && end1.issameorbefore(end2)){
            var duration = moment.duration(end1.diff(start1))
            //duration.as('hours');
            //duration.as('minutes');
            //duration.as('seconds');
            //duration.as('milliseconds');
            console.log('包含情况2')
            return duration.as('seconds')
        }
        console.log('未匹配到任何模式')
        return 0
    }
    //测试
    //1、数据正确性
    console.log(bw(['2024-01-01 00:03:01','2024-01-01 00:01:01'],['2024-01-01 00:00:50','2024-01-01 00:01:55']))
    //2、两段时间无交叉
    console.log(bw(['2024-01-01 00:01:01','2024-01-01 00:01:01'],['2024-01-02 00:00:50','2024-01-02 00:01:55']))
    //3、交叉情况1
    console.log(bw(['2024-01-01 00:00:01','2024-01-01 00:01:01'],['2024-01-01 00:00:50','2024-01-01 00:01:55']))
    //4、交叉情况2
    console.log(bw(['2024-01-01 00:00:50','2024-01-01 00:01:55'],['2024-01-01 00:00:01','2024-01-01 00:01:01']))
    //5、包含情况1
    console.log(bw(['2024-01-01 00:00:01','2024-01-01 00:01:55'],['2024-01-01 00:00:50','2024-01-01 00:01:01']))
    //6、包含情况2
    console.log(bw(['2024-01-01 00:00:50','2024-01-01 00:01:01'],['2024-01-01 00:00:01','2024-01-01 00:01:55']))

</script>
</body>
</html>

上面代码测试结果为:

总结

到此这篇关于如何在js中计算两个时间段重叠的时长问题详解的文章就介绍到这了,更多相关js计算时间段重叠时长内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com