如何将本地化星期名称转换为C#的DayOfWeek枚举?
将本地化星期名称转换为DayOfWeek枚举(C#)
原生解决方案:利用DateTime解析
C#里有原生方式可直接将本地化星期名称转换为DayOfWeek枚举,不用手动写switch或维护翻译映射表,核心是借助DateTime.TryParseExact结合指定文化信息完成解析:
代码示例(德语星期名称转换)
using System; using System.Globalization; public static DayOfWeek? ParseGermanDayName(string dayName) { // 指定德语文化信息 var deCulture = new CultureInfo("de-DE"); // 解析星期全称,自动忽略大小写 if (DateTime.TryParseExact( dayName, "dddd", deCulture, DateTimeStyles.None, out DateTime result)) { return result.DayOfWeek; } // 可选:同时支持缩写形式(如"Mo"对应Montag) if (DateTime.TryParseExact( dayName, "ddd", deCulture, DateTimeStyles.None, out result)) { return result.DayOfWeek; } // 解析失败返回null,可根据业务需求改为抛出异常 return null; }
关键说明
- 自动处理大小写问题,比如"montag"或"MONTAG"都能解析为
DayOfWeek.Monday - 切换
CultureInfo参数(如"fr-FR"对应法语)就能适配多语言场景 "dddd"对应星期全称,"ddd"对应缩写形式,可根据实际存储格式选择或同时支持
进阶:适配多种格式场景
如果存储的文本有多种格式(全称、缩写、地区变体),可以通过DateTimeFormatInfo.GetAllDateTimePatterns获取目标文化下所有支持的星期格式,批量尝试解析:
public static DayOfWeek? ParseLocalizedDayName(string dayName, string cultureCode) { var culture = new CultureInfo(cultureCode); // 获取所有包含星期的格式模板 var fullDayPatterns = culture.DateTimeFormat.GetAllDateTimePatterns('D'); var shortDayPatterns = culture.DateTimeFormat.GetAllDateTimePatterns('d'); var allPatterns = fullDayPatterns.Concat(shortDayPatterns).Distinct(); foreach (var pattern in allPatterns) { if (pattern.Contains("dddd") || pattern.Contains("ddd")) { if (DateTime.TryParseExact(dayName, pattern, culture, DateTimeStyles.None, out DateTime result)) { return result.DayOfWeek; } } } return null; }
对比手动映射的优势
- 不用手动维护各语言的星期名称映射表,避免遗漏或翻译错误
- 自动适配目标文化的本地化规则,比如部分地区星期起始日差异,枚举会自动对应正确值
- 天然支持大小写不敏感匹配,解决你提到的大小写错误问题
内容的提问来源于stack exchange,提问作者finder2
相关产品推荐
相关产品推荐

