2016-04-22 26 views
22

Tôi muốn nhận được ngày giữa hai ngày. Thay vì dự kiến ​​ ngày khác nhau, tôi nhận được và hết bộ nhớ. Điều gì sẽ là vấn đề với mã dưới đây?Cách lấy ngày giữa hai ngày trong C#

StartDate giá trị là 01/04/2016 00:00:00

EndDate giá trị là 10/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 Xin lỗi, bộ não mệt mỏi, không thấy họ đã nhận được vòng lặp vô hạn như thế nào – Draken

+1

Bản sao có thể có của * [Nhận tất cả DateTime giữa hai 'DateTime's in C#] (http://stackoverflow.com/questions/3227927/ get-all-datetimes-between-hai-datetimes-in-c-sharp) * –

Trả lời

35

Bạn chưa gán giá trị của date.Value.AddDays(1) để bất cứ điều gì, vì vậy nó kết thúc trong một vòng lặp vô hạn. Bạn cần thay đổi mã của mình để date được đặt thành kết quả của AddDays.

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

Điều này. Giống như 'String', các thao tác trên các đối tượng' DateTime' trả về một đối tượng _new_ thay vì sửa đổi đối tượng hiện có. – Nyerguds

+0

Dựa trên lời giải thích của OP (có nghĩa là mã này biên dịch và hoạt động), 'ngày này' trông giống như 'DateTime?', không phải' DateTime' vì 'DateTime' không có thuộc tính được gọi là' Giá trị'. –

+0

Mã cập nhật của bạn không biên dịch vì 'Nullable ' không có phương thức được gọi là 'AddDays'. –

12

Theo như tôi có thể thấy, kể từ AddDays phương thức trả về một thể hiện mới của một DateTime, nó không thay đổi các ví dụ hiện tại kể từ DateTimeimmutable.

Có vẻ như date của bạn là DateTime?, bạn có thể thay đổi phần này thành;

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

Như usr nhọn, này có thể bị ảnh hưởng trên DST. Bạn cũng có thể muốn kiểm tra Dmitry's answer.

+0

Điều này không có lỗi do tính chất gia tăng của tính toán? Nếu StartDate là lúc 2:30 sáng, thời gian sẽ thay đổi nếu bạn đã từng đạt đến ngày tiết kiệm ban ngày. AddDays không hoạt động như một số nguyên. – usr

+0

@usr Bạn đúng, 'Cấu trúc DateTime' hiện _not_ xem xét DST trong các phép toán số học. Nhưng dựa trên ngày bắt đầu và kết thúc của OP, đó không phải là một trường hợp. Cập nhật câu trả lời của tôi để trả lời câu hỏi của Dmitry. Cảm ơn bạn. –

+0

Hiệu suất của điều này là khủng khiếp, vì nó mở rộng danh sách nhiều lần. – jessehouwing

1

Quyết định thay đổi nó với một việc phải làm/trong khi

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 giải pháp (giả sử tạoselectedDates):

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

Đây là câu trả lời hay nhất vì nó tránh tính toán gia tăng mà là một mô hình chống. Thậm chí không chắc chắn rằng ý tưởng 'AddDays (1)' thậm chí còn chính xác. – usr

+3

Tại sao cần tạo một 'DateTime? 'Mới? Điều gì sẽ là vấn đề với việc chọn giá trị trả về của 'StartDate.AddDays (index)'? –

+2

@AshBurlaczenko: 'StartDate.AddDays' có giá trị trả về' DateTime', nhưng người hỏi đã sử dụng 'List ' trong câu hỏi của mình. 'DateTime mới?' chỉ đơn giản là một cách để buộc giá trị trả về cho kiểu đích. –

5

Một ký hiệu ngắn hơn bằng phương pháp Dải LINQ của sử dụng khả năng đã tìm ra số ngày sử dụng thuộc tính TimeSpan.Days sau khi trừ đi bắt đầu từ đầu.

Giả sử bắt đầu được trước khi kết thúc bạn muốn kết thúc với:

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

Nếu bạn cần nó để được Nullable, thêm:

.Cast<DateTime?>() 

Nếu bạn cần điều này để có một danh sách, thêm:

.ToList() 

Nó có thể hiệu quả hơn một chút so với giải pháp dựa trên LINQ khác.

Các vấn đề liên quan