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

Posted

技术标签:

【中文标题】如何列出所有月份名称,例如一个组合?【英文标题】:How to list all month names, e.g. for a combo? 【发布时间】:2010-09-23 20:07:23 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.MonthNames

【讨论】:

【参考方案2】:

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

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

或获取所有名称:

string[] names = DateTimeFormatInfo.CurrentInfo.MonthNames;

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

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

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

【讨论】:

您的第二个示例无法编译。您需要创建DateTimeFormatInfo 的新实例或从静态类调用其GetInstance() 方法。例如new DateTimeFormatInfo().MonthNames;DateTimeFormatInfo.GetInstance().MonthNames 我已经更正了 cmets 指出的问题(将来您可以编辑帖子)。 注意:我必须将答案与Enumerable.Range 一起使用,因为DateTimeFormatInfo.MonthNames 返回一个包含13 个元素的数组,所以如果您在.Select 上使用它,最后会得到一个空项目。跨度> 【参考方案3】:

您可以从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】:

尝试枚举月份名称:

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

它在 System.Globalization 命名空间中。

希望有帮助!

【讨论】:

我使用 CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName【参考方案5】:

它们被定义为全球化命名空间中的一个数组。

using System.Globalization;

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

【讨论】:

【参考方案6】:
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;

【讨论】:

【参考方案7】:

此方法将允许您将月份的键值对列表应用于它们的 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();

【讨论】:

就像使用 Enumerable.Range 一样,我将把它与 MVC SelectListItems 的 List 一起使用【参考方案8】:
public IEnumerable<SelectListItem> Months

  get
  
    return Enumerable.Range(1, 12).Select(x => new SelectListItem
    
      Value = x.ToString(),
      Text = DateTimeFormatInfo.CurrentInfo.GetMonthName(x)
    );
  

【讨论】:

【参考方案9】:

一种在 C# 中使用 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 个月。

【讨论】:

谢谢! TakeWhile 正是我所需要的。 :)【参考方案10】:

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

    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.

【讨论】:

【参考方案11】:

一个小 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 子句【参考方案12】:

如何以任意顺序创建自定义月份名称列表

是的,我正在回答一个 10 多年前的问题! :D

然而,我想添加此代码 sn-p 以期可能对其他人有所帮助。它显示了如何以任何自定义顺序输出月份名称列表。在我的情况下,我需要它在 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 ....

【讨论】:

【参考方案13】:

当然,我会针对一个 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。【参考方案14】:

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

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

【讨论】:

【参考方案15】:

您可以使用 linq 轻松地执行以下操作,这样您的下拉列表中就只有 12 个项目。

var Months = new SelectList((DateTimeFormatInfo.CurrentInfo.MonthNames).Take(12));

【讨论】:

以上是关于如何列出所有月份名称,例如一个组合?的主要内容,如果未能解决你的问题,请参考以下文章

C#:用 CSV 中的单列填充组合框

如何在 SQL SERVER 的列中列出所有可能的组合?

SQL:如何在数据库中的所有视图中搜索 ID 并列出提供结果的视图和列名称? [复制]

递归控制-列出所有组合

如何从大字典中列出的每个类别的所有可能的值组合创建数据框

如何在组合框中返回未绑定列的值