如何列出所有月份名称,例如组合?

Pro*_*ofK 68 .net c# asp.net datetime

目前我正在DateTime为每个月创建一个并将其格式化为仅包含月份.
还有其他或更好的方法吗?

Yon*_*ona 155

您可以使用它DateTimeFormatInfo来获取该信息:

// Will return January
string name = DateTimeFormatInfo.CurrentInfo.GetMonthName(1);
Run Code Online (Sandbox Code Playgroud)

或获得所有名称:

string[] names = DateTimeFormatInfo.CurrentInfo.MonthNames;
Run Code Online (Sandbox Code Playgroud)

您还可以DateTimeFormatInfo基于CultureInfowith 实例化新的,DateTimeFormatInfo.GetInstance或者您可以使用当前文化的CultureInfo.DateTimeFormat属性.

var dateFormatInfo = CultureInfo.GetCultureInfo("en-GB").DateTimeFormat;
Run Code Online (Sandbox Code Playgroud)

请记住,.Net中的日历最多支持13个月,因此,对于仅有12个月的日历(例如在en-US或fr中找到的日历),您将在末尾获得额外的空字符串.

  • 你的第二个例子不会编译.您需要创建一个新的`DateTimeFormatInfo`实例或从静态类.eg`new DateTimeFormatInfo().MonthNames;`或`DateTimeFormatInfo.GetInstance().MonthNames调用它的`GetInstance()`方法. (7认同)
  • 我已经纠正了评论中提到的问题(将来你可以编辑帖子). (2认同)
  • 注意:我不得不使用带有 `Enumerable.Range` 的答案,因为 `DateTimeFormatInfo.MonthNames` 返回一个包含 13 个元素的数组,所以如果你使用 `.Select`,你会在最后得到一个空项目。 (2认同)

mmm*_*eff 28

此方法允许您将几个月的键值对列表应用于其int对应项.我们使用Enumerable Ranges和LINQ生成一行.万岁,LINQ代码打高尔夫球!

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

要将其应用于ASP下拉列表:

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


Roh*_*est 19

您可以使用以下命令返回包含月份名称的字符串数组

System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.MonthNames
Run Code Online (Sandbox Code Playgroud)


Dyl*_*tie 12

它们被定义为Globalization命名空间中的数组.

using System.Globalization;

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


小智 6

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


Gre*_*reg 5

您可以从 中获取本地化月份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 );
}
Run Code Online (Sandbox Code Playgroud)

根据日历类型的不同,一年中的月数可能存在一些问题,但在此示例中我只是假设了 12 个月。


Zac*_*tes 5

尝试枚举月份名称:

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

它位于System.Globalization命名空间中.

希望有所帮助!


Div*_*Ops 5

一点 LINQ 只是因为它非常简洁:

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

您需要Where 子句,因为日历返回第13 个月的名称(英文为空)。

该索引返回 IEnumerable 内的索引,因此您需要为实际月份索引+1。


Sea*_*anH 5

当然,我会对一个 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);
Run Code Online (Sandbox Code Playgroud)

输出(来自 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
Run Code Online (Sandbox Code Playgroud)

希望有人觉得这很有用!