繁体   English   中英

计算日期范围内的天数 c#

[英]Calculating the number of days a range of dates c#

更新

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

例如:

我想在以下范围内查询到波士顿旅行的天数:

RangeEnd 是 27. Nov. 2017 RangeStart 是 1. Nov. 2017

这是我更新的代码:

 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();

您需要 first 或 default incase 有 0 个结果或超过 1 个 recuslt

这样的事情怎么样。 我得到的总数是 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));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM