如何parsing一个月份的名称(string)为一个整数在C#比较?

我需要能够比较一些数组中的月份名称。

如果有一些直接的方式就好了:

Month.toInt("January") > Month.toInt("May") 

我的谷歌search似乎build议唯一的办法是写自己的方法,但这似乎是一个普遍的问题,我认为它已经在.Net中实现,任何人做过这之前?

DateTime.ParseExact(monthName, "MMMM", CultureInfo.CurrentCulture ).Month

虽然,为了你的目的,你可能会更好的创build一个Dictionary<string, int>映射月份的名字到它的值。

如果您使用几个人build议的DateTime.ParseExact()方法,则应该仔细考虑在非英语环境中运行应用程序时要执行的操作。

在丹麦, ParseExact("Januar", ...)ParseExact("January", ...)哪一个应该工作,哪一个应该失败?

这将是CultureInfo.CurrentCultureCultureInfo.InvariantCulture之间的区别。

你可以做这样的事情:

 Convert.ToDate(month + " 01, 1900").Month 

您可以使用DateTime.Parse方法获取DateTime对象,然后检查其月份属性。 做这样的事情:

 int month = DateTime.Parse("1." + monthName + " 2008").Month; 

诀窍是build立一个有效的date来创build一个DateTime对象。

你可以使用一个月的枚举:

 public enum Month { January, February, // (...) December, } public Month ToInt(Month Input) { return (int)Enum.Parse(typeof(Month), Input, true)); } 

不过,我不是100%确定enum.Parse()的语法。

您不必创build一个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文化,所以这个unit testing通过:

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

我将把它作为一个练习给读者创build一个重载,你可以传入一个显式的CultureInfo。

一个简单的解决scheme是创build一个名称和值的字典。 然后使用Contains()可以find正确的值。

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

如果您正在使用c#3.0(或更高版本),则可以使用扩展程序

我将它翻译成西class牙语版本的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"; } } 

回答这个问题七年后,可以使用内置的方法进行比较:

 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版本。

我所做的就是使用SimpleDateFormat创build一个格式string,并将文本parsing为date,然后从中检索月份。 代码如下:

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