C#如何从短月份名称获取月份数字?能否用ParseExact实现?
问题
我需要从短月份名称(例如通过DateTime.ToString("MMM")生成的格式)中读取对应的月份数字,比如输入"feb"或"MAR"时返回2或3。
我已经编写了如下函数,但想了解是否可以使用ParseExact方法,传入虚拟的年/日来实现该功能?
private int GetNumberFromShortMonth(string month) { var monthNo = -1; var dt = new DateTime(2000, 01, 01); for (int i = 0; i <= 11; i++) { dt = dt.AddMonths(1); if (string.Equals(dt.ToString("MMM"), month, StringComparison.OrdinalIgnoreCase)) { monthNo = dt.Month; break; } } return monthNo; }
回答
完全可以用ParseExact实现,代码会更简洁高效。核心思路是把输入的短月份名称和虚拟年、日组合成完整日期字符串,通过ParseExact解析为DateTime对象后,直接取出月份数字即可。
需要注意这几点:
- 虚拟年、日可随意选择,只要是合法日期就行,比如"2000/01"
- 指定匹配的格式字符串
"MMM",对应短月份名称格式 - 设置
DateTimeStyles.IgnoreCase,支持大小写不敏感的匹配 - 建议用
TryParseExact替代ParseExact,避免输入无效月份时抛出异常,和原函数的错误返回逻辑保持一致
示例代码如下:
private int GetNumberFromShortMonth(string month) { // 拼接虚拟日期字符串,格式为"短月份 日, 年" var dateString = $"{month} 01, 2000"; if (DateTime.TryParseExact(dateString, "MMM dd, yyyy", CultureInfo.InvariantCulture, DateTimeStyles.IgnoreCase, out DateTime result)) { return result.Month; } // 输入无效时返回-1 return -1; }
如果需要适配特定地区的月份缩写,只需把CultureInfo.InvariantCulture换成对应区域文化即可,比如CultureInfo.GetCultureInfo("zh-CN")对应中文环境的短月份名称。
内容的提问来源于stack exchange,提问作者DaveWuzHere
相关产品推荐
相关产品推荐

