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

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

Ответ 1

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

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

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

string[] names = DateTimeFormatInfo.CurrentInfo.MonthNames;

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

var dateFormatInfo = CultureInfo.GetCultureInfo("en-GB").DateTimeFormat;

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

Ответ 2

Этот метод позволит вам применить список пар ключей значений месяцев к их двойным экземплярам. Мы генерируем его с помощью одной строки с использованием Enumerable Ranges и LINQ. Hooray, LINQ code-golfing!

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

Ответ 3

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

System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.MonthNames

Ответ 4

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

using System.Globalization;

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

Ответ 5

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

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

Это в пространстве имен System.Globalization.

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

Ответ 6

Вы можете получить список локализованных месяцев от 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 месяцев.

Ответ 7

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

Ответ 8

Способ получения динамической культуры определенного списка имен месяцев в С# с 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-й месяц.

Ответ 9

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

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

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

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

Ответ 10

Конечно, я внесу свой вклад в вопрос 10+ года.

В моем случае я создаю свойство, которое возвращает словарь (или аналогичный), сгенерированный с помощью следующего кода:

Dictionary<int, string> Months = Enumerable.Range(1, 12).Select(i => new KeyValuePair<int, string>(i, System.Globalization.DateTimeFormatInfo.CurrentInfo.GetMonthName(i))).ToDictionary(x => x.Key, x => x.Value);

Выход (из Linqpad):

Key Value
1   January
2   February
3   March
4   April
5   May
6   June
7   July
8   August
9   September
10  October
11  November
12  December

Надеюсь, кто-нибудь найдет это полезным!

Ответ 11

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;

Ответ 12

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;

Ответ 13

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

    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.

Ответ 14

Как создать произвольный список названий месяцев в любом порядке

Да, я отвечаю на вопрос более 10 лет назад! : D

Тем не менее, я хотел добавить этот фрагмент кода на случай, если он может помочь другим. Он показывает, как вывести список названий месяцев в произвольном порядке. В моем случае мне нужно, чтобы это началось в октябре, но вы можете поместить месяцы в любой последовательности (даже с повторяющимися месяцами), установив список целых чисел.

model.Controls = new
{
    FiscalMonths = new
    {
        Value = DateTime.Now.Month,
        Options = (new List<int> { 10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9 }).Select(p => new
        {
            Value = p,
            Text = DateTimeFormatInfo.CurrentInfo.GetMonthName(p)
        })
    }
};

И вывод JSON для использования в раскрывающемся списке:

  "FiscalMonths": {
   "Value": 10,
   "Options": [
    {
     "Value": 10,
     "Text": "October"
    },
    {
     "Value": 11,
     "Text": "November"
    },
    {
     "Value": 12,
     "Text": "December"
    },
    {
     "Value": 1,
     "Text": "January"
    },
    {
     "Value": 2,
     "Text": "February"
    },
    etc ....

Ответ 15

Я сделал следующим образом: (можно установить культуру)

var months = Enumerable.Range(1, 12).Select(i => 
    new
    {
        Index = i,
        MonthName = new CultureInfo("en-US").DateTimeFormat.GetAbbreviatedMonthName(i)
    })
    .ToDictionary(x => x.Index, x => x.MonthName);