如何列出所有月份名称,例如一个组合?
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));
【讨论】:
以上是关于如何列出所有月份名称,例如一个组合?的主要内容,如果未能解决你的问题,请参考以下文章