计算一系列日期的天数c#



更新

我在数据库中有一个旅行列表,其中有各种开始和结束日期,我想计算每次旅行与定义范围相对应的总天数。

例如:

我想查询波士顿之旅的天数,范围如下:

RangeEnd为27。2017年11月RangeStart为1。2017年11月

这是我更新的代码:

var travel = new List<Travel>
{
new Travel("Egypt", new DateTime(2017, 8, 4), new DateTime(2017, 8, 24) ),
new Travel("Spain", new DateTime(2017, 11, 1), new DateTime(2017, 12, 10) ),
new Travel("Detroit", new DateTime(2017,9, 15), new DateTime(2017, 12, 20) ),
new Travel("Boston", new DateTime(2017,10, 15), new DateTime(2017, 11, 20) ),
};
var rangeStart = new DateTime(2017, 11, 1);
var rangeEnd = new DateTime(2017, 11, 27);
var Trip = travel.Where(t => t.Country=="Boston");
var sumOfDays= Trip.Sum(t => ????);

这个病例的预期结果是20天。有人能帮忙吗?

感谢@Flydog57帮助我解决问题。我接受了你调用另一个函数的想法,它适用于范围。

var travel = new List<Travel>
{
new Travel("Egypt", new DateTime(2017, 8, 4), new DateTime(2017, 8, 24) ),
new Travel("Spain", new DateTime(2017, 11, 1), new DateTime(2017, 12, 10) ),
new Travel("Detroit", new DateTime(2017,9, 15), new DateTime(2017, 12, 20) ),
new Travel("Boston", new DateTime(2017,10, 15), new DateTime(2017, 11, 20) ),
};
var rangeStart = new DateTime(2017, 11, 1);
var rangeEnd = new DateTime(2017, 11, 27);
var Trip= travel.Where(s => s != null && s.City == "Boston");
var sumOfDays= Trip.Sum(t => GetTravelDaysWithinRange(t.Start,t.End,rangeStart, rangeEnd));

计算天数的函数是:

public int GetTravelDaysWithinRange( DateTime start, DateTime end, DateTime rangeStart, DateTime rangeEnd)
{
int days = 0;
while (start <= end)
{
if (start.Month>= rangeStart.Month && start.Month <= rangeEnd.Month && start.Year >= rangeStart.Year && start.Year <= rangeEnd.Year)
{
++days;
}
start = start.AddDays(1);
}
return days;
}

得出20的确切值:(((

这可以在1行中完成

var Trip = travel.Where(t => t.Country == "Boston").Select(x => (x.EndDate - x.StartDate).TotalDays).FirstOrDefault();

如果有0个结果或超过1个重新选择,您需要第一个或默认

这样的东西怎么样。我得到的总数是55,这正是我所期望的:

阶级旅行:

public class Travel
{
public Travel(string where, DateTime start, DateTime end)
{
Where = where;
StartDate = start;
EndDate = end;
}
public string Where { get; set; }
public DateTime StartDate { get; set; }
public DateTime EndDate { get; set; }
}

然后消费:

var travel = new List<Travel>
{
new Travel("Egypt", new DateTime(2017, 8, 4), new DateTime(2017, 8, 24) ),
new Travel("Spain", new DateTime(2017, 9, 1), new DateTime(2017, 10, 1) ),
new Travel("Detroit", new DateTime(2017,9, 15), new DateTime(2017, 9, 20) ),
};
var sumOfTravelDays = travel.Sum(t => (t.EndDate - t.StartDate).Days);

你看到了什么样的问题?

更新

将此函数添加到Travel类(在类中或作为扩展方法(:

public int GetTravelDaysWithinRange(DateTime rangeStart, DateTime rangeEnd)
{
//if everything is outside of the range to be considered, return 0
if (rangeEnd < StartDate || rangeStart > EndDate)
{
return 0;
}
//Find the Max of StartDate and rangeStart 
var startInRange = (rangeStart < StartDate) ? StartDate : rangeStart;
//And the Min of EndDate and rangeEnd
var endInRange = (rangeEnd > EndDate) ? EndDate : rangeEnd;
//and get the number of days in-between (and then add 1 so Mon-Fri is 5 days, not 4)
return (endInRange - startInRange).Days + 1;
}

现在,当我运行原始代码的变体时,它会做我认为你想要的事情:

var travel = new List<Travel>
{
new Travel("Egypt", new DateTime(2017, 8, 4), new DateTime(2017, 8, 24) ),
new Travel("Spain", new DateTime(2017, 11, 1), new DateTime(2017, 12, 10) ),
new Travel("Detroit", new DateTime(2017,9, 15), new DateTime(2017, 12, 20) ),
new Travel("Boston", new DateTime(2017,10, 15), new DateTime(2017, 11, 20) ),
};
var rangeStart = new DateTime(2017, 11, 1);
var rangeEnd = new DateTime(2017, 11, 27);
var sumOfDates = travel.Sum(t => t.GetTravelDaysWithinRange(rangeStart, rangeEnd));

最新更新