2008-11-24 8 views

Odpowiedz

134

można użyć do DateTimeFormatInfo aby uzyskać te informacje:

// Will return January 
string name = DateTimeFormatInfo.CurrentInfo.GetMonthName(1); 

lub uzyskać wszystkie nazwy:

string[] names = DateTimeFormatInfo.CurrentInfo.MonthNames; 

Można również utworzyć nowy egzemplarz DateTimeFormatInfo ba sed na CultureInfo z DateTimeFormatInfo.GetInstance lub możesz użyć właściwości aktualnej kultury CultureInfo.DateTimeFormat.

Należy pamiętać, że kalendarze z obsługą .Net mogą trwać do 13 miesięcy, dlatego na końcu pojawi się dodatkowy pusty ciąg znaków dla kalendarzy z tylko 12 miesiącami (np. Te znalezione w en-US lub fr na przykład).

+7

Twój drugi przykład nie zostanie skompilowany. Musisz utworzyć nowe wystąpienie 'DateTimeFormatInfo' lub wywołać jego metodę' GetInstance() 'z klasy statycznej .e.g. 'new DateTimeFormatInfo(). MonthNames;' lub 'DateTimeFormatInfo.GetInstance(). MonthNames' –

+1

Poprawiłem problemy zauważone przez komentarze (w przyszłości możesz po prostu edytować wpis). – user7116

19

można użyć następujących powrót tablicę ciąg zawierający nazwy miesięcy

System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.MonthNames 
4

Możesz otrzymać listę zlokalizowanych miesięcy z Thread.CurrentThread.CurrentCulture.DateTimeFormat.MonthNames i niezmiennych miesięcy od DateTimeFormatInfo.InvariantInfo.MonthNames.

string[] localizedMonths = Thread.CurrentThread.CurrentCulture.DateTimeFormat.MonthNames; 
string[] invariantMonths = DateTimeFormatInfo.InvariantInfo.MonthNames; 

for(int month = 0; month < 12; month++) 
{ 
    ListItem monthListItem = new ListItem(localizedMonths[month], invariantMonths[month]); 
    monthsDropDown.Items.Add(monthListItem); 
} 

Nie może być jakiś problem z liczbą miesięcy w roku, w zależności od rodzaju kalendarza, ale ja po prostu założyć, 12 miesięcy w tym przykładzie.

+0

Z jakiegoś powodu kod, który złapałem, używał nazwy Invariant dla właściwości ListItem.Value. Nie wiesz dlaczego, ale zamiast tego możesz użyć liczby całkowitej. – Greg

5

Spróbuj wyliczanie nazw miesiącu:

for(int i = 1; i <= 12; i++){ 
    combo.Items.Add(CultureInfo.CurrentCulture.DateTimeFormat.MonthNames[i]); 
} 

To w przestrzeni nazw System.Globalization.

Nadzieję, że pomaga!

+0

Używam CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName –

12

Są zdefiniowane jako tablica w przestrzeniach nazw globalizacji.

using System.Globalization; 

for (int i = 0; i < 12; i++) { 
    Console.WriteLine(CultureInfo.CurrentUICulture.DateTimeFormat.MonthNames[i]); 
} 
0
List<string> mnt = new List<string>();  
int monthCount = Convert.ToInt32(cbYear.Text) == DateTime.Now.Year ? DateTime.Now.Month : 12;  
      for (int i = 0; i < monthCount; i++)  
      {  
       mnt.Add(CultureInfo.CurrentUICulture.DateTimeFormat.MonthNames[i]);  
      }  
      cbMonth.DataSource = mnt; 
19

Metoda ta pozwala na zastosowanie listę kluczowych par wartości miesięcy do ich odpowiedników int. Generujemy go za pomocą pojedynczej linii przy użyciu zakresów zmiennych i LINQ. Hurra, kodowanie kodu LINQ!

var months = Enumerable.Range(1, 12).Select(i => new { I = i, M = DateTimeFormatInfo.CurrentInfo.GetMonthName(i) }); 

Aby zastosować go do listy rozwijanej ASP:

// <asp:DropDownList runat="server" ID="ddlMonths" /> 
ddlMonths.DataSource = months; 
ddlMonths.DataTextField = "M"; 
ddlMonths.DataValueField = "I"; 
ddlMonths.DataBind(); 
+1

Podobnie jak użycie Enumerable.Range, zamierzam użyć tego z listą MVC SelectListItems – John

3
public IEnumerable<SelectListItem> Months 
{ 
    get 
    { 
    return Enumerable.Range(1, 12).Select(x => new SelectListItem 
    { 
     Value = x.ToString(), 
     Text = DateTimeFormatInfo.CurrentInfo.GetMonthName(x) 
    }); 
    } 
} 
3

sposób, aby pobrać do dynamiczna kultura konkretną listę nazw miesięcy w C# z LINQ.

ComboBoxName.ItemsSource= 
System.Globalization.CultureInfo. 
CurrentCulture.DateTimeFormat.MonthNames. 
TakeWhile(m => m != String.Empty).ToList(); 

LUB

W tym przykładzie anonimowy obiekt tworzony jest z właściwością miesiąc i MONTHNAME

var months = CultureInfo.CurrentCulture.DateTimeFormat.MonthNames 
.TakeWhile(m => m != String.Empty) 
.Select((m,i) => new 
{ 
    Month = i+1, 
    MonthName = m 
}) 
.ToList(); 

PS: Używamy metoda TakeWhile ponieważ tablica MonthNames zawiera pusty 13 miesiąc.

0
string[] monthNames = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.MonthNames; 

foreach (string m in monthNames) // writing out 
{ 
    Console.WriteLine(m); 
} 

wyjściowa:

January 
February 
March 
April 
May 
June 
July 
August 
September 
October 
November 
December 

Aktualizacja: Należy pamiętać, że dla różnych lokalizacjach/kultur, wyjście nie może być w języku angielskim. Nie testowałem tego wcześniej.

Dla Stanów Zjednoczonych tylko w języku angielskim:

string[] monthNames = (new System.Globalization.CultureInfo("en-US")).DateTimeFormat.MonthNames; 
0

Tutaj jest dobrym przykładem dla wypełniania listy rozwijanej z miesięcy do postaci kartą kredytową:

Dim currentCulture As CultureInfo = CultureInfo.CurrentUICulture 
    Dim monthName, monthNumber As String 

    For x As Integer = 0 To 11 
     monthNumber = (x + 1).ToString("D2") 
     monthName = currentCulture.DateTimeFormat.MonthNames(x) 
     Dim month As New ListItem(String.Format("{0} - {1}", monthNumber, monthName), 
            x.ToString("D2")) 
     ddl_expirymonth.Items.Add(month) 
    Next 

tworzy następujące zlokalizowana w języku potocznym, przykład :

01 - January 
02 - February 
etc. 
2

Mały LINQ tylko dlatego, że jest pięknie zwięzły:

var monthOptions = DateTimeFormatInfo.CurrentInfo.MonthNames 
    .Where(p=>!string.IsNullOrEmpty(p)) 
    .Select((item, index) => new { Id = index + 1, Name = item }); 

Potrzebujesz klauzuli Where, ponieważ kalendarz zwraca 13-miesięczną nazwę (puste w języku angielskim).

Indeks zwraca indeks w IEnumerable, więc potrzebujesz +1 dla rzeczywistego indeksu miesiąca.

Powiązane problemy