2010-10-08 28 views
7

ben iki tarih arasındaki bireysel tarihleri ​​almak için kullandığınız aşağıdaki pasajı var arasındaki aylık dizi oluşturma .Mallar tarih aralığındaki ayları döndürür.iki tarih

Örneğin, 1/1/2010 ve 6/1/2010'u temin edersem 1/1/2010, 2/1/2010, 3/1/2010, 4/1/2010, 5/1/2010 ve 6/1/2010.

Herhangi bir fikrin var mı?

+0

Bir 'Months' özelliği nasıl çalışır? Hangi Ayın günlerini kullanacağını nasıl bilebilirdi? Çıkarmadan sonra, tarih-nötr olan bir TimeSpan ile kaldınız ve böylece hangi ayların kullanılacağı hakkında hiçbir şey bilmiyorsunuz. –

+0

olası [Ayın farkı] (http: // stackoverflow) kopyası.com/questions/1525990/aydaki fark) –

+0

'.Days, gerçek günler değil, aralıktaki ** ** gün sayısını döndürür. "Bir ay 2 tarih arasında *" gerçeğini nasıl tanımlarsınız? Bu aradaki ayda ** en az 1 gün ** var mı? Ay, aradaki ** tüm günlerdir **? Ayrıca 'DateTime' yapısını kullanarak bir ayı nasıl temsil etmelisiniz? - ayın ilk günü olarak mı? – CyberDude

cevap

25

bu deneyin:

Bu başlangıç ​​ayı ve bitiş ay içerir
static IEnumerable<DateTime> monthsBetween(DateTime d0, DateTime d1) 
{ 
    return Enumerable.Range(0, (d1.Year - d0.Year) * 12 + (d1.Month - d0.Month + 1)) 
        .Select(m => new DateTime(d0.Year, d0.Month, 1).AddMonths(m)); 
} 

. Bu, kaç ay olduğunu bulur ve ardından d0 ´s yıl ve ay bazında yeni bir DateTime oluşturur. Yani aylar yyyy-MM-01 gibi. d0 saatini ve gününü içermesini istiyorsanız, new DateTime(d0.Year, d0.Month, 1).AddMonths(m)'u d0.AddMonths(m) ile değiştirebilirsiniz.

Bir diziye ihtiyacınız olduğunu görüyorum, bu durumda yalnızca monthsBetween(..., ...).ToArray() kullanın veya yöntemin içine .ToArray() ekleyin.

private static IEnumerable<DateTime> ByMonths(DateTime startDate, DateTime endDate) 
{ 
    DateTime cur = startDate; 

    for(int i = 0; cur <= endDate; cur = startDate.AddMonths(++i)) 
    { 
    yield return cur; 
    } 
} 

ve bir dizi istiyorsanız o zaman bizim ToArray() çağrı:

0

Bu sizin için mi arıyorsunuz? Şart çok belirsiz.

DateTime[] calendarMonthBoundaries = Enumerable.Range(0, 1 + endDate.Subtract(startDate).Days) 
    .Select(offset => startDate.AddDays(offset)) 
    .Where(date => date.Day == 1) 
    .ToArray(); 
1

Sen ile aylık artışlar numaralandırmak olabilir. İstenen şeylerin olması muhtemel olan değerlere sahip olmak oldukça iyidir; Örneğin. Eğer Jan 31 st başlayacak eğer bir sonraki Feb 28 alırsınız sonra (artık yıllarda veya 29 th), 31 Mart st inci, ardından 30 Nisan benzeri ve inci .

+0

DateTime [] month = ByMonths ({30/01/2013 12:00:00}}, {4/04/2013 12:00:00 AM}) ToArray(); Bu sadece 3 ay döner (Ocak, Şubat, mar), Nisan eksik. –

+0

@DaveLucre Bunun kötü bir şey olduğundan emin değilim, çünkü sorudaki gereksinimin "aradaki" 'ı dikkate aldığından emin değilim. Bu durumda, Nisan'ı dahil etmek için kesinlikle değiştirilebilirdi, sadece yapması gerekip gerekmediğini bilmiyorum. –

3

Yıllar ve aylar arasında iki süreye ihtiyacım olduğundan, Lasse Espeholt'u biraz değiştirdim. varsayalım: d0 = 2012-11-03

d1 = 2013-02-05

sonuç böyle bir şey olacak:

2012-11

2012-12

2013-01

2013-02

private List<Tuple<int,int>> year_month_Between(DateTime d0, DateTime d1) 
    { 
     List<DateTime> datemonth= Enumerable.Range(0, (d1.Year - d0.Year) * 12 + (d1.Month - d0.Month + 1)) 
         .Select(m => new DateTime(d0.Year, d0.Month, 1).AddMonths(m)).ToList(); 
    List<Tuple<int, int>> yearmonth= new List<Tuple<int,int>>(); 

     foreach (DateTime x in datemonth) 
     { 
      yearmonth.Add(new Tuple<int, int>(x.Year, x.Month)); 
     } 
     return yearmonth; 
    } 
İlgili konular