2012-08-13 27 views
16

Me gustaría saber cuándo se dan las fechas de inicio y finalización, cómo se pueden recuperar los meses y años entre las dos fechas.Enumere los meses entre dos fechas

Por ejemplo: Start Date: '1/1/2011'(mm/dd/yyyy) y End date :'11/30/2011'. Los meses y años para ser recuperados son January,2011; February,2011; March,2011; and so on till November,2011

+8

Esto suena como una pregunta de tarea. La idea es que trabajes este para ti. Si tienes algún problema específico con la solución que encuentres, estaré encantado de ayudarte. –

+0

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

+1

@h1ghfive - no, no es un duplicado de ese – PHeiberg

Respuesta

1

Use esta fórmula:

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

Y u obtener el número de meses.

Utilízalo de forma adecuada y lo descifrarás.

Bienvenido a Stackoverflow, Here Hardwork es su parte y le da líneas de pensamiento para que la fraternidad lo haga cuando tenga un problema.

+0

Los meses deben verificarse para que el mes más bajo sea restado del mes superior, no puede asumir que el primer mes siempre es mayor que el segundo mes. –

+1

@Monkieboy - Tienes razón, pero, amigo, esto es una semilla. El dev aprende cuando se da la mano con problemas, así que deja que él resuelva cosas. – bhuvin

37

Aquí vamos

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

Y es obvio que llamamos como esto

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

Los resultados deben ser algo así como

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

Los nombres de los meses se efectúe en función de su cultura que , Creo, es exactamente lo que pediste, ¿verdad?

+1

+1: ¡Amigo, limpio! – bhuvin

+0

@GauravChouhan, buena edición. – Jodrell

+0

¡Eso es perfecto! Muchas gracias por esto ! – Ethenyl

6

Usted puede comenzar con un bucle while, donde la fecha de inicio es menor o igual a la fecha de finalización

Dentro de ella tire del mes correspondiente y una parte del año desde la fecha de inicio y almacenarlos (tal vez usted tiene una clase concreta o una como una), incremente la fecha de inicio para el 1 mes usando AddMonths(1)

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

Esto realmente debería ser la respuesta elegida. Literalmente 2 líneas de código vs. la respuesta elegida de muchas más. – Ricky

3

puede utilizar la función Enumerable.Range para obtener el mes y el año entre dos fechas,

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

Gracias, hermano. Uso este estilo {.Seleccione (e => e.ToString ("aaaMM"));} –

+0

incorrecto si fin.Día 2011-2-1 resultará en (2011-1). debe comparar con la última fecha en el mes de la fecha de finalización. .TakeWhile (a => a <= end.AddDays (DateTime.DaysInMonth (end.Year, end.Month) -end.Day)) – phiree

Cuestiones relacionadas