2009-07-29 21 views
16

मेरे पास एक कैलेंडर है जो चयनित तिथियों को एक विधि में स्ट्रिंग के रूप में पास करता है। इस विधि के अंदर, मैं चयनित प्रारंभ तिथि से शुरू होने वाली सभी तिथियों की एक सूची जेनरेट करना चाहता हूं और चयनित समाप्ति तिथि के साथ समाप्त होना चाहता हूं, स्पष्ट रूप से चयनित तिथियों और अंत तिथियों के बीच कितने दिन हैं, इस पर ध्यान दिए बिना, सभी तिथियों सहित।दो तिथियों के बीच लूप कैसे करें

नीचे मेरे पास उस विधि की शुरुआत है जो दिनांक तार लेता है और उन्हें डेटटाइम चर में परिवर्तित करता है ताकि मैं डेटटाइम गणना कार्यों का उपयोग कर सकूं। हालांकि, मैं काम शुरू नहीं कर सकता कि शुरुआत और समाप्ति तिथि के बीच की सभी तिथियों की गणना कैसे करें? स्पष्ट रूप से पहला चरण समाप्ति तिथि से प्रारंभ तिथि को घटाना है, लेकिन मैं शेष चरणों की गणना नहीं कर सकता।

सहायता की सराहना की,

दयालु संबंध।

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

जेनरेट किए गए मानों (दिनांक, घंटा, मिनट) के बीच आपका पता कदम क्या था –

उत्तर

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

संपादित कर सकते हैं

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

मुझे लगता है कि अधिकांश लोगों में उपज कीवर्ड का उपयोग बहुत कम है। उपयोग पर स्पॉट के लिएनेट +1! – MPritchard

+1

पूर्णता के लिए, मैं इसे स्थिर भी बना दूंगा – MPritchard

+0

अच्छी नौकरी, यह सही है –

2

आरंभ तिथि ले होगा करते हैं, और यह करने के लिए 1 दिन जोड़ने के लिए सबसे आसान काम (AddDays उपयोग करते हुए) जब तक आप समाप्ति तिथि आ जाने। कुछ इस तरह:

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

जाहिर है, आप थोड़ी देर सशर्त समायोजित करेगा और AddDays की स्थिति यदि आप संग्रह में है या नहीं आरंभ और समाप्ति तिथि शामिल करना चाहता पर निर्भर करता है कॉल।

[संपादित करें: वैसे, आप TryParse() मामले में पार्स() के बजाय तार में पारित का उपयोग कर अच्छी तरह से दिनांक में कनवर्ट न करें पर विचार करना चाहिए]

+0

सुनिश्चित करें कि समाप्ति तिथि प्रारंभ तिथि से भी अधिक है, इसलिए आप अनंत लूप में नहीं पहुंच पाएंगे। :) –

+1

ग्रेग, आपको == के साथ जांच नहीं करनी चाहिए, लेकिन <= –

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

के साथ आपको चर के रूप में 'i' का उपयोग करके लूप का सारांश मिला है। इसके लिए आपको बहुत धन्यवाद। –

4

तुम बस से पुनरावृति करने की जरूरत है जोड़ा गया कोड अपने विशिष्ट उदाहरण को हल करने और उपयोग प्रदर्शित करने के लिए: समाप्त करने के लिए शुरू करते हैं, तो आप इस एक में पाश के लिए

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

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

एक वैकल्पिक पद्धति

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

अब बुला कोड में आप निम्न कर सकते हैं:

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

एक और लाभ यह इस दृष्टिकोण है कि यह यह तुच्छ जोड़ने के लिए EachWeek, EachMonth आदि बनाता है ये सभी डेटटाइम पर पहुंच योग्य होंगे।

संबंधित मुद्दे