At the moment I m creating a DateTime
for each month and formatting it to only include the month.
Is there another or any better way to do this?
你可以使用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中找到的日历),您将在结尾获得额外的空字符串。
这种方法将允许您将月份的键值对列表应用于它们的 int
对应项。我们使用可枚举范围和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();
您可以使用以下代码返回一个包含月份名称的字符串数组。
System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.MonthNames
它们被定义为 Globalization 命名空间中的数组。
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 命名空间中。
希望可以帮到你!
public IEnumerable<SelectListItem> Months
{
get
{
return Enumerable.Range(1, 12).Select(x => new SelectListItem
{
Value = x.ToString(),
Text = DateTimeFormatInfo.CurrentInfo.GetMonthName(x)
});
}
}
仅仅使用一点LINQ就是因为它非常简练美观:
var monthOptions = DateTimeFormatInfo.CurrentInfo.MonthNames
.Where(p=>!string.IsNullOrEmpty(p))
.Select((item, index) => new { Id = index + 1, Name = item });
你需要使用Where语句,因为日历会返回13个月的名称(在英语中为空)。
索引返回IEnumerable中的索引,因此您需要为实际月份索引加上+1。
你可以从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个月。
当然,我会提供我的意见给一个超过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 在 C# 中检索动态 culture 特定的月份名称列表的方法。
ComboBoxName.ItemsSource=
System.Globalization.CultureInfo.
CurrentCulture.DateTimeFormat.MonthNames.
TakeWhile(m => m != String.Empty).ToList();
或者
在这个例子中,创建了一个具有月份和月份名称属性的匿名对象。
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个月。
我是这样做的:(可以设置文化)
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);
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
然而,我想把这段代码片段添加上去,以便有可能帮助其他人。它展示了如何以任何自定义顺序输出月份名称的列表。在我的情况下,我需要它从十月开始,但您可以通过设置整数列表将月份按任何序列排列(甚至有重复的月份)。
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 ....
您可以轻松使用LINQ执行类似下面的操作,以便您的下拉列表中仅显示12个项目。
var Months = new SelectList((DateTimeFormatInfo.CurrentInfo.MonthNames).Take(12));
- winforms
- combobox
- fogbugz
- java
- date
- internationalization
- asp.net
- iis
- url-rewriting
- urlrewriter
- c#
- enums
- ocaml
- haxe
- algorithm
- string
- viewstate
- .net
- c++
- c
- symbol-table
- mysql
- database
- postgresql
- licensing
- migration
- vb.net
- vb6
- declaration
- vb6-migration
- python
- psycopg2
- backup
- vmware
- virtualization
- gnu-screen
- authentication
- desktop
- excel
- xll
- cultureinfo
- regioninfo
- oracle
- client
- session
- download
- html
- virtual
- constructor
- scenarios
- perl
- full-text-search
- javascript
- ajax
- testing
- oop
- inheritance
- vim
- encapsulation
- information-hiding