2009-07-29 39 views
16

Tôi có lịch chuyển ngày đã chọn làm chuỗi thành một phương thức. Bên trong phương thức này, tôi muốn tạo một danh sách tất cả các ngày bắt đầu từ ngày bắt đầu đã chọn và kết thúc với ngày kết thúc đã chọn, rõ ràng bao gồm tất cả các ngày giữa, bất kể có bao nhiêu ngày giữa các ngày bắt đầu và ngày kết thúc đã chọn.Cách lặp lại giữa hai ngày

Dưới đây tôi có sự khởi đầu của phương thức lấy chuỗi ngày tháng và chuyển đổi chúng thành các biến DateTime để tôi có thể sử dụng các hàm tính toán DateTime. Tuy nhiên, tôi dường như không thể tính toán làm thế nào để tính toán tất cả các ngày giữa bắt đầu và ngày kết thúc? Rõ ràng giai đoạn đầu tiên là trừ ngày bắt đầu từ ngày kết thúc, nhưng tôi không thể tính toán phần còn lại của các bước.

Giúp đánh giá cao rất nhiều,

Trân trọng.

public void DTCalculations() 
{ 
List<string> calculatedDates = new List<string>(); 
string startDate = "2009-07-27"; 
string endDate = "2009-07-29"; 

//Convert to DateTime variables 
DateTime start = DateTime.Parse(startDate); 
DateTime end = DateTime.Parse(endDate); 

//Calculate difference between start and end date. 
TimeSpan difference = end.Subtract(start); 

//Generate list of dates beginning at start date and ending at end date. 
//ToDo: 
} 
+0

Bước bạn biết giữa các giá trị được tạo (ngày, giờ, phút) –

Trả lời

33
static IEnumerable<DateTime> AllDatesBetween(DateTime start, DateTime end) 
{ 
    for(var day = start.Date; day <= end; day = day.AddDays(1)) 
     yield return day; 
} 

Edit: Nhập mã để giải quyết ví dụ cụ thể của bạn và để chứng minh sử dụng:

var calculatedDates = 
    new List<string> 
    (
     AllDatesBetween 
     (
      DateTime.Parse("2009-07-27"), 
      DateTime.Parse("2009-07-29") 
     ).Select(d => d.ToString("yyyy-MM-dd")) 
    ); 
+2

Tôi luôn cảm thấy từ khóa lợi nhuận được sử dụng quá nhiều ở hầu hết mọi người .net +1 cho điểm sử dụng! – MPritchard

+1

Để hoàn thành, tôi cũng sẽ làm cho nó tĩnh quá – MPritchard

+0

Công việc tốt, nó hoàn hảo –

2

Điều dễ nhất cần làm là lấy ngày bắt đầu và thêm 1 ngày vào ngày đó (sử dụng AddDays) cho đến khi bạn đến ngày kết thúc. Một cái gì đó như thế này:

DateTime calcDate = start.Date; 
while (calcDate <= end) 
{ 
    calcDate = calcDate.AddDays(1); 
    calculatedDates.Add(calcDate.ToString()); 
} 

Rõ ràng, bạn sẽ điều chỉnh khi có điều kiện và vị trí của các AddDays gọi tùy thuộc vào nếu bạn muốn bao gồm đầu và ngày kết thúc trong bộ sưu tập hay không.

[Edit: Bằng cách này, bạn nên xem xét sử dụng TryParse() thay vì Parse() trong trường hợp thông qua trong chuỗi không chuyển đổi sang ngày độc đáo]

+0

Đảm bảo ngày kết thúc cũng lớn hơn ngày bắt đầu, vì vậy bạn sẽ không tham gia vòng lặp vô hạn. :) –

+1

Greg, bạn không nên kiểm tra với == nhưng với <= –

1
for(DateTime i = start; i <= end; i = i.AddDays(1)) 
{ 
    Console.WriteLine(i.ToShortDateString()); 
} 
+0

Bạn có ý chính của vòng lặp sử dụng 'i' làm biến. Cảm ơn bạn vì điều đó. –

4

Bạn chỉ cần lặp từ bắt đầu đến cuối, bạn có thể làm điều này trong một vòng lặp for

DateTime start = DateTime.Parse(startDate); 
DateTime end = DateTime.Parse(endDate); 

for(DateTime counter = start; counter <= end; counter = counter.AddDays(1)) 
{ 
    calculatedDates.Add(counter); 
} 
0

Một phương pháp thay thế

public static class MyExtensions 
{ 
    public static IEnumerable EachDay(this DateTime start, DateTime end) 
    { 
     // Remove time info from start date (we only care about day). 
     DateTime currentDay = new DateTime(start.Year, start.Month, start.Day); 
     while (currentDay <= end) 
     { 
      yield return currentDay; 
      currentDay = currentDay.AddDays(1); 
     } 
    } 
} 

Bây giờ trong mã gọi bạn có thể làm như sau:

DateTime start = DateTime.Now; 
DateTime end = start.AddDays(20); 
foreach (var day in start.EachDay(end)) 
{ 
    ... 
} 

Một ưu điểm khác để tiếp cận này là nó làm cho nó tầm thường để thêm EachWeek, EachMonth vv Tất cả những thứ này sẽ có thể truy cập được vào DateTime.

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