2016-04-22 154 views
22

我想獲得兩個日期之間的日期。而不是預期的不同的日期,我得到和內存不足。下面的代碼會有什麼問題?如何獲取C中兩個日期之間的日期#

StartDate01/04/2016 00:00:00

EndDate10/04/2016 00:00:00

var selectedDates = new List<DateTime?>(); 
for (var date = StartDate; date <= EndDate; date.Value.AddDays(1)) 
{ 
    selectedDates.Add(date); 
} 
+2

@JanesAbouChleih道歉,疲憊的大腦,並沒有看到他們如何得到無限循環 – Draken

+1

可能重複* [獲取所有日期時間之間的兩個'在C#中](http://stackoverflow.com/questions/3227927/獲取所有日期時間在兩個日期時間中的c-sharp)* –

回答

35

您還沒有分配的date.Value.AddDays(1)任何東西的價值,所以它在一個無限循環結束。您需要更改代碼,以便date設置爲AddDays的結果。

for (var date = StartDate; date <= EndDate; date = date.AddDays(1)) 
{ 
    selectedDates.Add(date); 
} 
+0

這個。像'String'一樣,'DateTime'對象的操作返回一個_new object_而不是修改現有的對象。 – Nyerguds

+0

根據OP的解釋(這意味着這段代碼編譯和工作),這個'date'看起來像'DateTime?',而不是'DateTime',因爲'DateTime'沒有一個名爲'Value'的屬性。 –

+0

您的更新代碼無法編譯,因爲'可空''沒有名爲'AddDays'的方法。 –

12

據我所看到的,因爲AddDays方法返回一個DateTime的新實例,它改變當前實例,因爲DateTimeimmutable

看起來像你的dateDateTime?,你可以改變這部分爲;

for (var date = StartDate; date <= EndDate; date = date.Value.AddDays(1)) 
{ 
    selectedDates.Add(date); 
} 

由於USR尖,這可能對DST的影響。您也可以檢查Dmitry's answer

+0

由於計算的增量性質,這是否有錯誤?如果StartDate在凌晨2:30,則如果您遇到夏令時,則時間將會改變。 AddDays行爲不像一個整數。 – usr

+0

@usr你說得對,'DateTime'結構在算術運算中不考慮DST。但根據OP的開始和結束日期,這不應該是一個例子。我的答案更新了點Dmitry的答案。謝謝。 –

+0

這樣的表現太糟糕了,因爲它多次擴展了列表。 – jessehouwing

1

決定用什麼來改變它,/而

var selectedDates = new List<DateTime?>(); 
DateTime? StartDate = DateTime.Parse("01/04/2016 00:00:00"); 
DateTime? EndDate = DateTime.Parse("10/04/2016 00:00:00"); 

do 
{ 
    selectedDates.Add(StartDate); 
    StartDate = StartDate.Value.AddDays(1); 
}while(StartDate < EndDate); 
23

LINQ溶液(讓我們產生selectedDates):

var selectedDates = Enumerable 
    .Range(0, int.MaxValue) 
    .Select(index => new DateTime?(StartDate.AddDays(index))) 
    .TakeWhile(date => date <= EndDate) 
    .ToList(); 
+1

這是最好的答案,因爲它避免了反模式的增量計算。甚至不確定「AddDays(1)」的想法是否正確。 – usr

+3

爲什麼需要創建一個新的'DateTime?'?選擇「StartDate.AddDays(index)」的返回值會有什麼問題? –

+2

@AshBurlaczenko:'StartDate.AddDays'具有'DateTime'的返回值,但提問者在他的問題中使用了'List '。 'new DateTime?'只是強制返回值到目標類型的一種方式。 –

5

使用LINQ的範圍方法更短的符號使用的能力在從結尾減去開始後已經計算出使用TimeSpan.Days屬性的天數。

假設開始時結束前你會結束:

DateTime StartDate = new DateTime(1979, 10, 4); 
DateTime EndDate = new DateTime(2016, 10, 4); 

var dates = Enumerable.Range(0, (EndDate - StartDate).Days + 1) 
    .Select(day => StartDate.AddDays(day)) 

如果你需要它是空的,添加:

.Cast<DateTime?>() 

如果您需要這是一個List,加:

.ToList() 

它可能比其他基於LINQ的解決方案更有效率。

相關問題