web-dev-qa-db-ja.com

すべての月名をリストする方法、例えばコンボのために?

現時点では、各月にDateTimeを作成し、月のみを含めるようにフォーマットしています。
これを行うための別の方法はありますか?

67
ProfK

DateTimeFormatInfo を使用して、その情報を取得できます。

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

またはすべての名前を取得するには:

string[] names = DateTimeFormatInfo.CurrentInfo.MonthNames;

また、 DateTimeFormatInfo.GetInstanceDateTimeFormatInfoに基づいて新しいCultureInfoをインスタンス化することもできます。現在のカルチャの CultureInfo.DateTimeFormat プロパティ。

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

.Netのカレンダーは最大13か月をサポートしているため、12か月しかないカレンダー(たとえばen-USやfrなど)の最後に余分な空の文字列を取得することに注意してください。

150
Yona

このメソッドを使用すると、月のキーと値のペアのリストを対応するintに適用できます。 Enumerable RangesとLINQを使用して1行で生成します。やったー、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();
28
mmmeff

次を使用して、月の名前を含む文字列の配列を返すことができます

System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.MonthNames
19
Rohan West

これらは、グローバリゼーション名前空間の配列として定義されています。

using System.Globalization;

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

月の名前を列挙してみてください:

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

System.Globalization名前空間にあります。

お役に立てば幸いです!

5
Zachary Yates

ローカライズされた月のリストは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 );
}

カレンダーの種類によっては、1年の月数に問題があるかもしれませんが、この例では12か月を想定しています。

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

[〜#〜] linq [〜#〜]C#動的カルチャ月名の特定のリストを取得する方法。

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

[〜#〜] or [〜#〜]

この例では、MonthおよびMonthNameプロパティを持つ匿名オブジェクトが作成されます

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

[〜#〜] ps [〜#〜]:MonthNames配列には空の13番目の月が含まれているため、メソッドTakeWhileを使用します。

3
Maher Ben Issa

それは美しく簡潔であるという理由だけで少しLINQ:

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

カレンダーは13番目の月名(英語では空)を返すため、Where句が必要です。

インデックスはIEnumerable内のインデックスを返すため、実際の月のインデックスには+1が必要です。

3
DivineOps

確かに、私は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

誰かがこれが役に立つことを願っています!

1
SeanH

私は次のようにしました:(文化を設定することは可能です)

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);
1
Tiago Ávila
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;
0
Nayeem Mansoori
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;
0
Jeevan Moses

以下は、ドロップダウンリストにクレジットカードの月のフォームを入力する良い例です。

    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.
0

任意の順序で月の名前のカスタムリストを作成する方法

はい、10年以上前の質問に答えています! :D

それでも、私はこのコードスニペットを他の人に役立つ可能性があると考えて追加しました。任意のカスタム順序で月名のリストを出力する方法を示します。私の場合、10月に開始する必要がありましたが、整数のリストを設定することにより、月を任意の順序で配置できます(繰り返し月がある場合でも)。

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 ....
0
Roberto