2012-08-13 20 views
16

Vorrei sapere quando date date di inizio e fine, come possono essere recuperati i mesi e gli anni tra le due date.Elencare i mesi tra due date

Ad esempio: Start Date: '1/1/2011'(mm/dd/yyyy) e End date :'11/30/2011'. I mesi e anni per essere recuperati sono January,2011; February,2011; March,2011; and so on till November,2011

+8

Sembra una domanda per i compiti. L'idea è che tu lavori questo per te stesso. Se hai problemi specifici con la soluzione che hai mai trovato, sarò lieto di aiutarti. –

+0

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

+1

@ h1ghfive - no, non è un duplicato di quello – PHeiberg

risposta

1

usare questa formula:

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

E u ottenere il numero di mesi.

Utilizzare questo in modo appropriato e si rompe.

Benvenuti in Stackoverflow, Here Hardwork è la tua parte e dà linee di pensiero per quello che la fraternità deve fare quando hai un problema.

+0

I mesi devono essere controllati in modo che il mese inferiore sia sottratto dal mese più alto, non può assumere che il primo mese sia sempre maggiore del secondo mese. –

+1

@Monkieboy - Hai ragione ma, amico, questo è un seme, lo sviluppatore impara quando stringe la mano con i problemi, quindi fagli capire le cose. – bhuvin

37

Qui andiamo

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

E ovviamente chiamare in questo modo

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

I risultati dovrebbero essere qualcosa di simile

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

i nomi dei mesi di essere dipendente dalla vostra cultura che , Penso, è esattamente quello che hai chiesto, giusto?

+1

+1: Amico, pulito !! – bhuvin

+0

@GauravChouhan, buona modifica. – Jodrell

+0

Perfetto! Grazie mille per questo! – Ethenyl

6

Si può iniziare con un ciclo while in cui la data di inizio è inferiore o uguale alla data di fine

All'interno di esso estrarre il mese in questione e parte anno dalla data di inizio e memorizzarli (forse hai una classe concreta o un come), poi incrementano la data di inizio del 1 mese con AddMonths(1)

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

Questa dovrebbe essere la risposta scelta. Letteralmente 2 righe di codice rispetto alla risposta scelta di molti altri. – Ricky

3

È possibile utilizzare la funzione Enumerable.Range per ottenere il mese e l'anno tra due date,

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

Grazie, fratello. Io uso questo stile {.Seleziona (e => e.ToString ("yyyyMM"));} –

+0

errato se end.Day 2011-2-1 comporterà (2011-1). deve essere confrontato con l'ultimo giorno del mese della data di fine. .TakeWhile (a => a <= end.AddDays (DateTime.DaysInMonth (end.Year, end.Month) -end.Day)) – phiree