Answers:
您可以执行以下操作:
Convert.ToDate(month + " 01, 1900").Month
一种简单的解决方案是使用名称和值创建一个Dictionary。然后使用Contains()可以找到正确的值。
Dictionary<string, string> months = new Dictionary<string, string>()
{
{ "january", "01"},
{ "february", "02"},
{ "march", "03"},
{ "april", "04"},
{ "may", "05"},
{ "june", "06"},
{ "july", "07"},
{ "august", "08"},
{ "september", "09"},
{ "october", "10"},
{ "november", "11"},
{ "december", "12"},
};
foreach (var month in months)
{
if (StringThatContainsMonth.ToLower().Contains(month.Key))
{
string thisMonth = month.Value;
}
}
您可以使用一个月的枚举:
public enum Month
{
January,
February,
// (...)
December,
}
public Month ToInt(Month Input)
{
return (int)Enum.Parse(typeof(Month), Input, true));
}
我对enum.Parse()的语法不确定100%。
public enum Month { January = 1, Feburary }
并且还应强制转换为int而不是Month。
您无需创建DateTime实例即可执行此操作。就这么简单:
public static class Month
{
public static int ToInt(this string month)
{
return Array.IndexOf(
CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
month.ToLower(CultureInfo.CurrentCulture))
+ 1;
}
}
我运行的是这种da-DK
文化,因此此单元测试通过了:
[Theory]
[InlineData("Januar", 1)]
[InlineData("Februar", 2)]
[InlineData("Marts", 3)]
[InlineData("April", 4)]
[InlineData("Maj", 5)]
[InlineData("Juni", 6)]
[InlineData("Juli", 7)]
[InlineData("August", 8)]
[InlineData("September", 9)]
[InlineData("Oktober", 10)]
[InlineData("November", 11)]
[InlineData("December", 12)]
public void Test(string monthName, int expected)
{
var actual = monthName.ToInt();
Assert.Equal(expected, actual);
}
我将其作为练习留给读者,以创建一个重载,您可以在其中传递显式CultureInfo。
ToLower()
-我不知道其中一个重载会转换字符串,using the casing rules of the specified culture
尽管公平地说,从方法名称中并不能明显看出它可以提供该功能。
CurrentCulture
。无论"January".ToLower(CultureInfo.CurrentCulture).Dump();
和"January".ToLower(new CultureInfo("en-NZ")).Dump();
输出january
,但一个月名都是大写的CurrentCulture.DateTimeFormat.MonthNames
。
ToLower
:)其实,有一个在我的代码稍有逻辑的漏洞,因为一个月的名称被赋予作为DA-DK全部小写。因此,要么不应该小写输入,要么应该也将所有月份名称都小写-取决于是否需要不区分大小写的匹配。
using the casing rules of the specified culture
的意思是它将大写,例如每个月数月日CultureInfo
。在您的示例中有效,因为月份名称是小写字母。有效演示使用单元测试进行误导。可能值得进行修改,以使您的示例清晰易懂:-)
在问了问题七年后回答了这个问题,可以使用内置方法进行此比较:
Month.toInt("January") > Month.toInt("May")
变成
Array.FindIndex( CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
t => t.Equals("January", StringComparison.CurrentCultureIgnoreCase)) >
Array.FindIndex( CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
t => t.Equals("May", StringComparison.CurrentCultureIgnoreCase))
为了简单起见,可以将其重构为扩展方法。下面是LINQPad示例(因此Dump()
调用方法):
void Main()
{
("January".GetMonthIndex() > "May".GetMonthIndex()).Dump();
("January".GetMonthIndex() == "january".GetMonthIndex()).Dump();
("January".GetMonthIndex() < "May".GetMonthIndex()).Dump();
}
public static class Extension {
public static int GetMonthIndex(this string month) {
return Array.FindIndex( CultureInfo.CurrentCulture.DateTimeFormat.MonthNames,
t => t.Equals(month, StringComparison.CurrentCultureIgnoreCase));
}
}
输出:
False
True
True
Public Function returnMonthNumber(ByVal monthName As String) As Integer
Select Case monthName.ToLower
Case Is = "january"
Return 1
Case Is = "february"
Return 2
Case Is = "march"
Return 3
Case Is = "april"
Return 4
Case Is = "may"
Return 5
Case Is = "june"
Return 6
Case Is = "july"
Return 7
Case Is = "august"
Return 8
Case Is = "september"
Return 9
Case Is = "october"
Return 10
Case Is = "november"
Return 11
Case Is = "december"
Return 12
Case Else
Return 0
End Select
End Function
警告代码为Beta版本。
我将其翻译成西班牙语版本的C#代码,请注意:
public string ObtenerNumeroMes(string NombreMes){
string NumeroMes;
switch(NombreMes) {
case ("ENERO") :
NumeroMes = "01";
return NumeroMes;
case ("FEBRERO") :
NumeroMes = "02";
return NumeroMes;
case ("MARZO") :
NumeroMes = "03";
return NumeroMes;
case ("ABRIL") :
NumeroMes = "04";
return NumeroMes;
case ("MAYO") :
NumeroMes = "05";
return NumeroMes;
case ("JUNIO") :
NumeroMes = "06";
return NumeroMes;
case ("JULIO") :
NumeroMes = "07";
return NumeroMes;
case ("AGOSTO") :
NumeroMes = "08";
return NumeroMes;
case ("SEPTIEMBRE") :
NumeroMes = "09";
return NumeroMes;
case ("OCTUBRE") :
NumeroMes = "10";
return NumeroMes;
case ("NOVIEMBRE") :
NumeroMes = "11";
return NumeroMes;
case ("DICIEMBRE") :
NumeroMes = "12";
return NumeroMes;
default:
Console.WriteLine("Error");
return "ERROR";
}
}
我所做的是使用SimpleDateFormat创建格式字符串,然后将文本解析为日期,然后从中检索月份。代码如下:
int year = 2012 \\or any other year
String monthName = "January" \\or any other month
SimpleDateFormat format = new SimpleDateFormat("dd-MMM-yyyy");
int monthNumber = format.parse("01-" + monthName + "-" + year).getMonth();
此代码可以帮助您...
using System.Globalization;
....
string FullMonthName = CultureInfo.CurrentCulture.DateTimeFormat.GetMonthName(DateTime.UtcNow.Month);
GetMonthName方法-返回字符串...
如果要以整数形式表示月份,则只需使用-
DateTime dt= DateTime.UtcNow;
int month= dt.Month;
希望对您有帮助!!!
谢谢!!!