让我先解释一下情况-假设我有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;
}先感谢你的帮助,
阿米特
发布于 2013-12-30 17:22:32
试试这个:
private static double GetOverlappingDays(DateTime firstStart, DateTime firstEnd, DateTime secondStart, DateTime secondEnd)
{
DateTime maxStart = firstStart > secondStart ? firstStart : secondStart;
DateTime minEnd = firstEnd < secondEnd ? firstEnd : secondEnd;
TimeSpan interval = minEnd - maxStart;
double returnValue = interval > TimeSpan.FromSeconds(0) ? interval.TotalDays : 0;
return returnValue;
}发布于 2013-12-30 17:11:42
尝试使用for循环:
DateTime d1 = new DateTime(2013,12,1),
d2 = new DateTime(2013,12,14),
d3 = new DateTime(2013,12,10),
d4 = new DateTime(2013,12,20);
int count = 0;
for (var d = d1.Date; d <= d2.Date; d = d.AddDays(1))
{
if (d >= d3.Date && d <= d4.Date)
count++;
}
Console.WriteLine(count);注意,这段代码给出了整数值。如果您需要以小时为单位的值,此代码将不适用。此外,这不是最有效的方法,但它很简单,在小范围内工作良好。
发布于 2013-12-30 17:22:14
如果您有两个强相关的值,比如开始日期和结束日期,那么使用object which will hold them both是个好主意。考虑创建DateRange类:
public class DateRange
{
public DateRange(DateTime start, DateTime end)
{
if (start > end) throw new ArgumentException();
Start = start;
End = end;
}
public DateTime Start { get; private set; }
public DateTime End { get; private set; }
public double TotalDays { get { return (End - Start).TotalDays; } }
public bool Includes(DateTime value)
{
return (Start <= value) && (value <= End);
}
public DateRange Intersect(DateRange range)
{
if (range.Includes(Start))
return new DateRange(Start, (End < range.End) ? End : range.End);
if (range.Includes(End))
return new DateRange(range.Start, End);
if (Start < range.Start && range.End < End)
return range;
return null;
}
}用法:
public static double GetNumOfOverLappingDays(DateRange b, DateRange p)
{
DateRange overlap = b.Intersect(p);
if (overlap == null)
return 0;
return overlap.TotalDays;
}创建日期范围并将其传递给此方法:
var b = new DateRange(new DateTime(2013, 12, 20), new DateTime(2013, 12, 25));
var p = new DateRange(new DateTime(2013, 12, 22), new DateTime(2013, 12, 26));
double totalDays = GetNumOfOverLappingDays(b, p);https://stackoverflow.com/questions/20836429
复制相似问题