如何在 C# 中比较两个期间日期?[复制]

How to compare two period dates in C#? [duplicate]

提问人:lunisolar 提问时间:7/28/2021 最后编辑:lunisolar 更新时间:7/28/2021 访问量:525

问:

class Period {
   public DateTime Start { get; set; }
   public DateTime End { get; set; } 
}

我在比较两个 Period 对象的布尔逻辑方面遇到困难

假设在 DB 中,我有以下 Period 对象。

var periodInDb = new Period { 
   Start = DateTime.ParseExact("2022-12-18", "yyyy-MM-dd", CultureInfo.InvariantCulture);
   End = DateTime.ParseExact("2023-01-11", "yyyy-MM-dd", CultureInfo.InvariantCulture);
};

我只想添加一个新句点,如果它不在上述句点之间。

我已经在纸上写下了一些可能会添加的场景日期,我可能错过了一些场景:

开课时间:2022/12/18
结束时间:2023/01/11

一些方案日期:

开始时间:2022/12/19 ✔️
结束时间:2023/01/10 ❌

❌ 不要添加,因为介于
------------------end date2022/12/18 - 2023/01/11


开课时间:2022/12/19 ✔️
结束时间:2023/01/12 ✔️

❌ 不要添加,因为介于
------------------start date2022/12/18 - 2023/01/11


开课时间:2022/12/17 ✔️
结束时间:2023/01/12 ✔️

❌ 不要添加,因为部分内容不在
------------------start date and end date2022/12/18 - 2023/01/11

开课时间:2022/12/16 ✔️
结束时间:2023/12/17 ✔️

✔️ 添加,因为不在
------------------start date and end date2022/12/18 - 2023/01/11

我如何知道一个时期是否属于另一个时期?

C# 日期时间 布尔逻辑

评论

0赞 Tim Schmelter 7/28/2021
我建议使用这个库,它使这个 trival 并保持你的代码可读性:codeproject.com/Articles/168662/Time-Period-Library-for-NET
0赞 Joel Coehoorn 7/28/2021
2022-13-18?那是什么时候?
0赞 lunisolar 7/28/2021
@JoelCoehoorn我的意思是2022-12-18
1赞 lunisolar 7/29/2021
为什么这个问题被标记为重复,这是,而不是?date range compared to date rangedate range compared to datetime
0赞 Rafalon 7/29/2021
它不是正确的重复项,但它是此(检测重叠周期的算法)的副本,该算法已被标记为该副本(确定两个日期范围是否重叠

答:

2赞 Joel Coehoorn 7/28/2021 #1
public bool HasOverlap(Period p1, Period p2)
{
    return p1.End >= p2.Start && p1.Start <= p2.End;
}

评论

0赞 Rafalon 7/29/2021
这。请注意,根据 OP 的规格,不等式可能很严格,但这里的逻辑很好