首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获取两个区间的重叠天数?

如何获取两个区间的重叠天数?
EN

Stack Overflow用户
提问于 2013-12-30 17:06:22
回答 5查看 3.2K关注 0票数 7

让我先解释一下情况-假设我有4个日期: BS,BE,PS,PE (S代表开始,E代表结束)。我需要知道在给定这些日期的情况下,有多少天已经结束了。例如: BE-05.01,BS-10.01,PS-03.01,PE-07.01结果为:3 (05.01,06.01,07.01重叠)

我写了下面的代码,但它看起来很乱,我想看看是否有更简单的方法来做到这一点:

代码语言:javascript
复制
private static double GetNumOfOverLappingDays(DateTime BS, DateTime BE, DateTime PS, DateTime PE)
    {
        //case 1:
        //                  |--- B ---|
        //                  |----P ---|

        //case 2:
        //                  |--- B ---|
        //                          | --- P --- |

        //case 3:
        //                  |--- B ---|
        //          | --- P ---- |

        //case 4:
        //                  |--- B ---|
        //                     | - P - |

        //case 5:
        //                  |--- B ---|
        //              | -------- P -------- |

        double days = -1;
        bool isNotOverLap = (BS > PE) || (PS > BE);

        if (isNotOverLap == false)
        {
            //case 1
            if (BS == PS && BS == PE)
            {
                days = (PE - PS).TotalDays;
            }
            //case 2
            else if (BE > PS && BE < PE)
            {
                days = (BE - PS).TotalDays;
            }
            //case 3
            else if (BS > PS && BS < PE)
            {
                days = (PE - BS).TotalDays;
            }
            //case 4
            else if (BS < PS && BE > PE)
            {
                days = (PE - PS).TotalDays;
            }
            //case 5
            else if (BS > PS && BE < PE)
            {
                days = (BE - PS).TotalDays;
            }
        }
        return days+1;
    }

先感谢你的帮助,

阿米特

EN

Stack Overflow用户

发布于 2021-03-18 16:29:16

我使用它来获取两个时间范围之间的重叠范围,您可以很容易地从结果中获得重叠的天数

代码语言:javascript
复制
public static (DateTime, DateTime)? GetOverlappingTimeRange((DateTime, DateTime) firstTimeRange, 
                                                            (DateTime, DateTime) secondTimeRange)
{
    var leftIndex = Math.Max(firstTimeRange.Item1.Ticks, secondTimeRange.Item1.Ticks);
    var rightIndex = Math.Min(firstTimeRange.Item2.Ticks, secondTimeRange.Item2.Ticks);

    if (leftIndex > rightIndex)
    {
        return null;
    }
    else
    {
        return (new DateTime(leftIndex), new DateTime(rightIndex));
    }
}
票数 1
EN
查看全部 5 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20836429

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档