2013-09-06 9 views
13

Ich versuche, eine Funktion zu machen, die zwischen zwei Daten in C#
Erhalten Sie alle Monatsnamen zwischen zwei angegebenen Daten

List<string> liMonths = MyFunction(date1,date2); 

meine Funktion

MyFunction(DateTime date1,DateTime date2) 
{ 

//some code 
return listOfMonths; 
} 

können Sie mir helfen, alle Monatsnamen gibt Wie könnte ich das tun

+2

Haben Sie irgendwelche Ideen, wie man es umsetzen? – christopher

+0

Sollen die Namen der Monate 'date1' und' date2' im Ergebnis enthalten sein? – ykb

+0

@Suhan das OP fragt nach den Namen, nicht die Anzahl der Monate –

Antwort

29

Keine Linq-Lösung?

var start = new DateTime(2013, 1, 1); 
var end = new DateTime(2013, 6, 22); 

// set end-date to end of month 
end = new DateTime(end.Year, end.Month, DateTime.DaysInMonth(end.Year, end.Month)); 

var diff = Enumerable.Range(0, Int32.MaxValue) 
        .Select(e => start.AddMonths(e)) 
        .TakeWhile(e => e <= end) 
        .Select(e => e.ToString("MMMM")); 
+0

Dies ist eine bessere Lösung als die "Diese Frage hat bereits eine Antwort hier:". –

5

Erstellen Sie eine Schleife beginnt date1 bis date2. Fügen Sie für jeden Schritt Ihrer Schleife einen Monat hinzu und geben Sie Ihre Rückgabevariable den Monat ein.

Ich versuche in Metasprache Ihr Ziel zu schreiben: noch

DateTime currDate = date1 
List myList = new List(); 
while (currDate < date2) { 
    myList.add(getMonthName(currDate)); 
    currDate = currDate.addMonth(1); 
} 
+0

Ich benutzte Sie Code und erkannte, dass 'addMonth (1)' ändert den Wert von currDate nicht, Sie müssen 'currDate.addMonth (1)' einer neuen Variablen zuweisen und diese Variable 'currDate' zuweisen, um ihren Wert zu ändern. Tun Sie das einfach while (currDate Dev

+1

Hallo, ich habe meine Antwort behoben. mit currDate = currDate.addMonth (1); –

1
List<string> MonthNames(DateTime date1, DateTime date2) 
    { 
     var monthList = new List<string>(); 

     while (date1 < date2) 
     { 
      monthList.Add(date1.ToString("MMMM/yyyy")); 
      date1 = date1.AddMonths(1); 
     } 

     return monthList; 
    } 
2
DateTime from; 
DateTime to; 


var source = from.Month > to.Month ? 
       Enumerable.Range(from, 12).Concat(Enumerable.Range(1, to.Month)) 
      : Enumerable.Range(1, 12) 
       .SkipWhile(m => m >= from.Month) 
       .TakeWhile(m => m <= to.Month) 
var monthes = source 
    .Select(m => CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(m)); 
+1

Es ist nett, aber denke, es wird scheitern, wenn Sie nach November bis Mai. – Sayse

+1

@Sayse: Ja, sicher. aktualisiert. –

+1

Es scheitert auch, wenn Sie nach April 2013 - April 2014, aber dies kann nicht in Frage zu sein :) – Sayse

4

können Sie Linq verwenden, um mit einer Hilfsfunktion

IEnumerable<DateTime> GetDates(DateTime date1, DateTime date2) 
{ 
    while (date1 <= date2) 
    { 
     yield return date1; 
     date1 = date1.AddMonths(1); 
    } 

    if (date1 > date2) 
    { 
     // Include the last month 
     yield return date1; 
    } 
} 

Dann können MyFunction sein eine der folgenden

1) Enthalten Jahr Name

List<string> MyFunction(DateTime date1, DateTime date2) { 
    return GetDates(date1,date2).Select(x => x.ToString("MMMM yyyyy")).ToList(); 
} 

2) Nur der Monatsname, mit Duplikaten

List<string> MyFunction(DateTime date1, DateTime date2) { 
    return GetDates(date1,date2).Select(x => x.ToString("MMMM")).ToList(); 
} 

3) Distinct Monatsnamen

List<string> MyFunction(DateTime date1, DateTime date2) { 
    return GetDates(date1,date2).Select(x => x.ToString("MMMM")).Distinct().ToList(); 
} 
1
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)); 
} 
1

Hier ist ein Einzeiler für Sie.

var date1 = new DateTime(2013, 02, 17); 
var date2 = new DateTime(2013, 09, 06); 

var monthsBetween = DateTimeFormatInfo.CurrentInfo.MonthNames.Where((_, i) => ++i >= date1.Month && i <= date2.Month); 
1
private static List<string> MyFunction(DateTime date1, DateTime date2) 
     { 

      var listOfMonths=new List<string>(); 
      if (date1.CompareTo(date2) == 1) 
      { 
       var temp = date2; 
       date2 = date1; 
       date1 = temp; 
      } 

      var mosSt = date1.Month; 
      var mosEn = date2.Month; 
      var yearSt = date1.Year; 
      var yearEn = date2.Year; 

      while (mosSt < mosEn || yearSt < yearEn) 
      { 
       var temp = new DateTime(yearSt, mosSt, 1); 
       listOfMonths.Add(temp.ToString("MMMM", CultureInfo.InvariantCulture)); 
       mosSt++; 
       if (mosSt < 13) continue; 
       yearSt++; 
       mosSt = 1; 
      } 

      return listOfMonths; 
     } 
Verwandte Themen