2017-06-28 142 views
-1

我試圖編寫一個查詢,返回發生在一天的某個小時內加上持續時間的日期。例如,在(8PM + 8小時)之後發生的任何DateTime,小時和持續時間是可變的。小時+持續時間可能在第二天。 A秒殺:LINQ與持續時間之間的小時數之間的日期時間

[Test] 
public void should_find_dates_between_beginhour_plus_duration() 
{ 
    var dates = new [] 
    { 
       new DateTime(2017, 1, 3, 12,0,0), 
       new DateTime(2017, 1, 4, 21,0,0), 
       new DateTime(2017, 1, 5, 2,0,0) 
    }; 

    var beginHour = 20; //8pm 
    var duration = 8; //hours 

    var results = dates.Where(x => x.Hour >= beginHour && x <= x.???? + duration); 

    //should contain the last 2 dates 

    foreach (var date in results) 
    { 
     Console.WriteLine(date); 
    } 
} 
+0

日期無關緊要?只有一小時? –

+0

'x.AddHours(持續時間)' – JSteward

+0

@SergeyBerezovskiy小時+持續時間可以進入下一個「日期」。應該包含在結果中。 – mxmissile

回答

2

因此冬/夏時間轉移在這裏並不重要,那麼您可以在運行查詢之前計算結束小時數。過濾將很簡單 - 您選擇的小時數大於開始小時數(晚些時候)或小於結束小時數(即早上早些時候):

var endHour = DateTime.Today.AddHours(beginHour + duration).Hour; 
var results = dates.Where(x => beginHour < endHour 
        ? (beginHour <= x.Hour && x.Hour <= endHour) 
        : (beginHour <= x.Hour || x.Hour <= endHour)); 
+1

,我認爲這將是一個艱難的,spisobo – mxmissile

+2

雖然似乎沒有工作,在這個小測試我提出http://rextester.com/ NKT68441 – Isac

+1

@Isac真的,謝謝。當結束時間落入同一天時,我錯過了這種情況。更新的解決方案 –