2012-08-13 16 views
16

Başlangıç ​​ve bitiş tarihleri ​​verildiğinde, iki tarih arasındaki aylar ve yılların nasıl alınacağını bilmek istiyorum.İki tarih arasındaki ayları listele

Örn: Start Date: '1/1/2011'(mm/dd/yyyy) ve End date :'11/30/2011'. ay ve yılı alınacak January,2011; February,2011; March,2011; and so on till November,2011

+8

Bu, ev ödevi sorusu gibi görünüyor. Fikir şu ki bu işi kendiniz için yapıyorsunuz. Çözdüğünüz herhangi bir sorunla ilgili herhangi bir sorununuz varsa, size yardımcı olmaktan memnuniyet duyarız. –

+0

Kopyala: http://stackoverflow.com/questions/1525990/difference-in-months – h1ghfive

+1

@ h1ghfive - hayır, bu bir kopyanın kopyası değil. – PHeiberg

cevap

1

kullanın bu formül şunlardır:

((date1.Year - date2.Year) * 12) + date1.Month - date2.Month 

Ve u ay sayısını olsun.

Bunu uygun bir şekilde kullanın ve çatlarsınız.

Stackoverflow'a Hoş Geldiniz, İşte Hardwork sizin rolünüzdür ve bunun için bir düşünme problemi oluştuğunda kardeşlik için düşünme çizgileri verir. İşte

+0

Aylar kontrol edilmeli çünkü alt ay yüksek aydan çıkarılmış, ilk ayın her zaman ikinci aydan daha büyük olduğunu varsaymaz. –

+1

@Monkieboy - Haklısınız ama, Dostum bu bir tohum, Dev, sorunlarıyla el sıkışırken öğrenir, o zaman bir şeyler anlamasına izin verin. – bhuvin

37

biz

public static IEnumerable<Tuple<string, int>> MonthsBetween(
      DateTime startDate, 
      DateTime endDate) 
    { 
     DateTime iterator; 
     DateTime limit; 

     if (endDate > startDate) 
     { 
      iterator = new DateTime(startDate.Year, startDate.Month, 1); 
      limit = endDate; 
     } 
     else 
     { 
      iterator = new DateTime(endDate.Year, endDate.Month, 1); 
      limit = startDate; 
     } 

     var dateTimeFormat = CultureInfo.CurrentCulture.DateTimeFormat; 
     while (iterator <= limit) 
     { 
      yield return Tuple.Create(
       dateTimeFormat.GetMonthName(iterator.Month), 
       iterator.Year);     
      iterator = iterator.AddMonths(1); 
     } 
    } 

gitmek Ve belli ki sonuç

{ 
    { "January", 2011 }, 
    { "February", 2011 }, 
    { "March", 2011 }, 
    { "April", 2011 }, 
    { "May", 2011 }, 
    { "June", 2011 }, 
    { "July", 2011 }, 
    { "August", 2011 }, 
    { "September", 2011 }, 
    { "October", 2011 }, 
    { "November", 2011 }, 
} 

gibi bir şey Kültürünüzde bağımlı olmaktan ay adlarını olmalıdır bu

var startDate = DateTime.ParseExact("01/01/2011", "MM/dd/yyyy"); 
var endDate = DateTime.ParseExact("11/30/2011", "MM/dd/yyyy"); 

var months = MonthsBetween(startDate, endDate); 

gibi diyoruz ki Sanırım, tam olarak istediğin şey, değil mi?

+1

+1: Dostum, Temiz! – bhuvin

+0

@GauravChouhan, iyi düzenleme. – Jodrell

+0

Bu mükemmel! Bunun için çok teşekkürler! – Ethenyl

6

Sen başlangıç ​​tarihi o başlangıç ​​tarihinden itibaren, ilgili Ay ve yıl bölümü çekin ve sahip belki (depolamak içinde bitiş tarihine

daha az veya eşit olan bir süre döngü ile başlayabilirsiniz somut bir sınıf veya bir şekilde a), o zaman, iki tarih arasındaki ay ve yıl olsun Enumerable.Range işlevini kullanabilirsiniz AddMonths(1)

//something on these lines 
while(startdate <= enddate) 
{ 
// pull out month and year 
startdate = startdate.AddMonths(1); 
} 
+0

Bu gerçekten seçilen cevap olmalı. Kelimenin tam anlamıyla 2 satırlık kod ve daha birçok cevabın seçilmiş cevabı. – Ricky

3

kullanılarak 1 ay başlangıç ​​tarihini artırmaz

var start = new DateTime(2011, 1, 1); 
var end = new DateTime(2011, 11, 30); 

var diff = Enumerable.Range(0, 13).Select(a => start.AddMonths(a)) 
      .TakeWhile(a => a <= end) 
      .Select(a => String.Concat(a.ToString("MMMM") + ", " + a.Year)); 
+0

Teşekkürler kardeşim. Bu stili kullanıyorum {.Select (e => e.ToString ("yyyyMM"));} –

+0

eğer end.Day 2011-2-1 (2011-1) ile sonuçlanacaktır. Bitiş tarihi ayındaki son tarihle karşılaştırılmalıdır. .TakeWhile (a => a <= end.AddDays (DateTime.DaysInMonth (son .Year, end.Month) -end.Day)) – phiree

İlgili konular