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


74

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

Answers:


166

您可以使用DateTimeFormatInfo获取以下信息:

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

或获取所有名称:

string[] names = DateTimeFormatInfo.CurrentInfo.MonthNames;

您也可以DateTimeFormatInfo基于CultureInfowith实例化一个新属性,DateTimeFormatInfo.GetInstance也可以使用当前区域性的CultureInfo.DateTimeFormat属性。

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

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


7
您的第二个示例将无法编译。您需要为静态类.eg或DateTimeFormatInfoGetInstance()new DateTimeFormatInfo().MonthNames;DateTimeFormatInfo.GetInstance().MonthNames
Man

2
我已更正了评论中提到的问题(以后您可以编辑帖子)。
user7116 2013年

1
注意:我必须将答案与一起使用,Enumerable.Range因为它DateTimeFormatInfo.MonthNames返回一个包含13个元素的数组,因此,如果.Select在那末,您将得到一个空项目。
CompuChip

32

此方法将允许您将几个月的键值对列表应用于其int对应对象。我们使用Enumerable Ranges和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();

1
如使用Enumerable.Range的,我要与MVC SelectListItems的列表,这样用
约翰

19

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

System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.MonthNames

12

它们在全球化名称空间中定义为数组。

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命名空间中。

希望有帮助!


我使用的是CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName
砂拉越Positwinyu

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

取决于日历类型,一年中的月数可能会有一些问题,但是在此示例中我仅假设了12个月。


由于某种原因,我抓取的代码使用的是ListItem.Value属性的不变名称。不知道为什么,但是您可能想要使用一个整数代替。
格雷格

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

4

只是因为它非常简洁,所以提供了一些LINQ:

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

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

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


Where条款的
最终依据

3

一种使用LINQC#中检索动态文化特定月份名称列表的方法。

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个月。


3

当然,我将输入一个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

希望有人觉得这有用!


LINQ非常好。
ProfK

1
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;

1

我通过以下方式进行操作:(可以设置文化)

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

0
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

这是一个用“信用卡月份”表格填写下拉列表的好例子:

    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

您可以使用linq轻松执行以下操作,这样下拉菜单中只有12个项目。

var Months = new SelectList((DateTimeFormatInfo.CurrentInfo.MonthNames).Take(12));
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.