我需要能够比较我在数组中的一些月份名称.
如果有一些直接的方式会很好:
Month.toInt("January") > Month.toInt("May")
我的谷歌搜索似乎建议唯一的方法是编写自己的方法,但这似乎是一个常见的问题,我认为它本来已经在.Net中实现过,之前有人这样做了吗?
DateTime.ParseExact(monthName, "MMMM", CultureInfo.CurrentCulture ).Month
虽然,为了您的目的,您可能最好只创建Dictionary
月份名称到其值的映射.
你可以这样做:
Convert.ToDate(month + " 01, 1900").Month
如果你使用了DateTime.ParseExact()
几个人建议的方法,你应该仔细考虑当应用程序在非英语环境中运行时你想要发生什么!
在丹麦,它的ParseExact("Januar", ...)
和ParseExact("January", ...)
应该工作,哪些应该失败?
这将是之间的差异CultureInfo.CurrentCulture
和CultureInfo.InvariantCulture
.
您可以使用DateTime.Parse方法获取DateTime对象,然后检查其Month属性.做这样的事情:
int month = DateTime.Parse("1." + monthName + " 2008").Month;
诀窍是建立一个有效的日期来创建一个DateTime对象.
您可以使用月份枚举:
public enum Month { January, February, // (...) December, } public Month ToInt(Month Input) { return (int)Enum.Parse(typeof(Month), Input, true)); }
但是,我不是100%肯定enum.Parse()的语法.
一个简单的解决方案是创建一个包含名称和值的Dictionary.然后使用Contains(),您可以找到正确的值.
Dictionarymonths = new Dictionary () { { "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; } }
您不必创建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.