【发布时间】:2013-12-30 09:06:22
【问题描述】:
让我先解释一下情况 - 假设我有 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重叠)
我写了以下代码,但它似乎很乱,我想检查是否有更简单的方法来做到这一点:
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;
}
提前感谢您的帮助,
阿米特
【问题讨论】:
-
如果这些是日期,那么您需要确定是否要包含或排除结束日期,一方面。例如,假设它们是 all 2014 年 1 月 1 日。将值视为日期,我希望在这种情况下重叠 1 天 - 但您的代码将给出 0 天。日期范围通常包括结束点,而日期/时间范围不包括。这只是 Noda Time 将
LocalDate作为单独类型的一个原因... -
你是正确的。我正在为“天”值添加 +1 以解决此问题
-
请在问题中注明,这样会更清楚。
-
回应 Jon 的评论 - 包括时间的范围通常表示为半开间隔
[start, end),其中不包括结束时间。例如,如果我说一个事件发生在1:00 - 2:00,我通常的意思是 2:00 不在范围内,因为该事件已经结束。但是对于仅日期范围(DateTime的时间部分被忽略),这些通常是完全包含 范围,[start, end],例如当我说Jan 1 - Jan 31时。决定您将使用哪个,因为它确实会影响您的实现中的逻辑。