Как перечислить все названия месяцев, например, для комбо?


в данный момент я создаю DateTime для каждого месяца и форматирования его, чтобы включить только месяц.
Есть ли другой или лучший способ сделать это?

12 62

12 ответов:

можно использовать DateTimeFormatInfo чтобы получить эту информацию:

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

или, чтобы получить все имена:

string[] names = DateTimeFormatInfo.CurrentInfo.MonthNames;

вы также можете создать новый DateTimeFormatInfo на основе CultureInfo С DateTimeFormatInfo.GetInstance или вы можете использовать текущую культуру CultureInfo.DateTimeFormat собственность.

имейте в виду, что календари в .Net поддерживают до 13 месяцев, таким образом, вы получите дополнительную пустую строку в конце для календарей только с 12 месяцами (например найдено в en-US или fr например).

этот метод позволит вам применить список пар ключевых значений месяцев к их аналогам int. Мы генерируем его с помощью одной строки, используя перечислимые диапазоны и LINQ. Ура, код LINQ-гольф!

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

чтобы применить его к выпадающему списку ASP:

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

вы можете использовать следующее, чтобы вернуть массив строк, содержащих имена месяцев

System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.MonthNames

они определяются как массив в пространствах имен глобализации.

using System.Globalization;

for (int i = 0; i < 12; i++) {
   Console.WriteLine(CultureInfo.CurrentUICulture.DateTimeFormat.MonthNames[i]);
}

попробуйте перечислить названия месяцев:

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

это в системе.Пространство имен глобализации.

надеюсь, что это поможет!

вы можете получить список локализованных месяцев с Thread.CurrentThread.CurrentCulture.DateTimeFormat.MonthNames и инвариантные месяцев с 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 );
}

там может быть какая-то проблема с количеством месяцев в году в зависимости от типа календаря, но я только что предположил 12 месяцев в этом примере.

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

способ получения динамическая культура конкретный список имен месяцев в C# С LINQ.

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

или

в этом примере анонимный объект создается со свойством Month и MonthName

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

PS: мы используем метод TakeWhile, потому что массив MonthNames содержит пустой 13-й месяц.

немного LINQ только потому, что он красиво лаконичен:

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

вам нужно предложение Where, потому что календарь возвращает имя 13-го месяца (пустое на английском языке).

индекс возвращает индекс в пределах IEnumerable, поэтому вам нужно +1 для фактического индекса месяца.

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;
string[] monthNames = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.MonthNames;

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

выход:

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

обновление: Обратите внимание, что для разных языков и культур выходные данные могут быть не на английском языке. Хотя раньше я этого не проверял.

только для нас английский:

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

вот хороший пример для заполнения выпадающего списка с месяцами для формы кредитной карты:

    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

создает следующее локализованное на текущий язык, например:

01 - January
02 - February
etc.