現時点では、各月にDateTime
を作成し、月のみを含めるようにフォーマットしています。
これを行うための別の方法はありますか?
DateTimeFormatInfo
を使用して、その情報を取得できます。
// Will return January
string name = DateTimeFormatInfo.CurrentInfo.GetMonthName(1);
またはすべての名前を取得するには:
string[] names = DateTimeFormatInfo.CurrentInfo.MonthNames;
また、 DateTimeFormatInfo.GetInstance
でDateTimeFormatInfo
に基づいて新しいCultureInfo
をインスタンス化することもできます。現在のカルチャの CultureInfo.DateTimeFormat
プロパティ。
var dateFormatInfo = CultureInfo.GetCultureInfo("en-GB").DateTimeFormat;
.Netのカレンダーは最大13か月をサポートしているため、12か月しかないカレンダー(たとえばen-USやfrなど)の最後に余分な空の文字列を取得することに注意してください。
このメソッドを使用すると、月のキーと値のペアのリストを対応する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();
次を使用して、月の名前を含む文字列の配列を返すことができます
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]);
}
System.Globalization名前空間にあります。
お役に立てば幸いです!
ローカライズされた月のリストは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か月を想定しています。
public IEnumerable<SelectListItem> Months
{
get
{
return Enumerable.Range(1, 12).Select(x => new SelectListItem
{
Value = x.ToString(),
Text = DateTimeFormatInfo.CurrentInfo.GetMonthName(x)
});
}
}
[〜#〜] 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を使用します。
それは美しく簡潔であるという理由だけで少しLINQ:
var monthOptions = DateTimeFormatInfo.CurrentInfo.MonthNames
.Where(p=>!string.IsNullOrEmpty(p))
.Select((item, index) => new { Id = index + 1, Name = item });
カレンダーは13番目の月名(英語では空)を返すため、Where句が必要です。
インデックスはIEnumerable内のインデックスを返すため、実際の月のインデックスには+1が必要です。
確かに、私は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
誰かがこれが役に立つことを願っています!
私は次のようにしました:(文化を設定することは可能です)
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);
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;
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;
以下は、ドロップダウンリストにクレジットカードの月のフォームを入力する良い例です。
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.
任意の順序で月の名前のカスタムリストを作成する方法
はい、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 ....