簡體   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