2010-07-29 1 views
44

के बीच प्रत्येक दिन पर इटरेट करें मेरे पास DateTime स्टार्टडेट और एंडडेट है।स्टार्टडेट और एंडडेट

मैं, चाहे कितने बार, उन दोनों के बीच प्रत्येक दिन भर में कैसे हो सकता है?

उदाहरण: स्टार्टडेट 7/20/2010 5:10:32 अपराह्न और एंडडेट 7/29/2010 1:59:12 पूर्वाह्न है।

मैं 7/20, 7/21, 7/22 .. 7/29 में पुन: प्रयास करने में सक्षम होना चाहता हूं।

+0

यहाँ एक नज़र डालें: http://stackoverflow.com/questions/533767/how-do-you-iterate-through-every-day-of-the-year –

उत्तर

112
for(DateTime date = StartDate; date.Date <= EndDate.Date; date = date.AddDays(1)) 
{ 
    ... 
} 

दैट यह सुनिश्चित करना है कि आपके पास आखिरी दिन है, उदाहरण के लिए।

+0

मुझे लगता है कि आप 'date.Date <= EndDate.Date' चाहते हैं ताकि आपको मिल सके अंतिम दिन –

+2

यह एक अनंत लूप में जाता है, AddDays विधि दिनांक बदलती नहीं है, लेकिन एक नया डेटटाइम उदाहरण देता है। दिनांक = दिनांक का उपयोग करें। इसके बजाय विज्ञापन (1)। – corvuscorax

+0

@ डीन: धन्यवाद, परिवर्तन के बाद आपकी टिप्पणी देखी गई। –

0
DateTime date = DateTime.Now; 
DateTime endDate = date.AddDays(10); 

while (date < endDate) 
{ 
    Console.WriteLine(date); 
    date = date.AddDays(1); 
} 
3

आपको अंतिम तिथि के बारे में सावधान रहना होगा। उदाहरण के लिए,

उदाहरण: स्टार्टडेट 7/20/2010 5:10:32 अपराह्न है और एंडडेट 7/29/2010 1:59:12 पूर्वाह्न है।
मैं 7/20, 7/21, 7/22 .. 7/29 में फिर से भरने में सक्षम होना चाहता हूं।

date < endDate में कभी भी 7/29 शामिल नहीं होंगे। जब आप 1 दिन से 7/28 5:10 अपराह्न जोड़ते हैं - यह 7/2 9 5:10 अपराह्न बन जाता है जो 7/2 9 2 बजे से अधिक है।

अगर ऐसा नहीं है कि आप क्या चाहते हैं तो मैं आपको बस इतना

for (DateTime date = start.Date; date <= end.Date; date += TimeSpan.FromDays(1)) 
{ 
    Console.WriteLine(date.ToString()); 
} 

या उस प्रभाव के लिए कुछ कहना चाहते हैं।

11

एक वैकल्पिक विधि जो अधिक पुन: प्रयोज्य हो सकती है डेटटाइम पर एक एक्सटेंशन विधि लिखना और एक आईनेमरेबल लौटना है।

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)) 
{ 
    ... 
} 

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

+1

आप डेटटाइम के साथ तिथि से समय की जानकारी निकाल सकते हैं। दिनांक: https://msdn.microsoft.com/en-us/library/system.datetime.date(v=vs.110).aspx – Oswin

+1

आप क्यों नहीं क्या यह टाइप-सुरक्षित है? IENumerable ? – duedl0r

0

@Yuriy Faktorovich के छोरों, @healsjnr और @mho सब एक System.ArgumentOutOfRangeException: The added or subtracted value results in an un-representable DateTime अपवाद अगर EndDate == DateTime.MaxValue फेंक देते हैं। इसे रोकने के लिए, पाश

for(DateTime date = StartDate; date.Date <= EndDate.Date; date = date.AddDays(1)) 
{ 
    ... 
    if (date.Date == DateTime.MaxValue.Date) 
    { 
     break; 
    } 
} 

के अंत में एक अतिरिक्त जांच जोड़ने (मैं @Yuriy Faktorovich के जवाब के लिए एक टिप्पणी के रूप में इस पोस्ट किया है होगा, लेकिन मैं प्रतिष्ठा की कमी)

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