C#使用TryParseExact解析带完整月份名的法语日期失败原因排查
问题原因
你遇到的匹配失败核心原因是空格字符类型不匹配:
fr-FR文化下使用d MMMM yyyy格式输出日期时,数字、月份、年份之间的分隔空格是非断行空格(Unicode编码U+00A0),而你输入的7 août 2008里的空格大概率是普通半角空格(ASCII编码32),两种空格字符不一致导致严格匹配失败。
解决方法
下面三种方案任选一种即可:
- 方案一:预处理输入字符串,把所有普通空格替换为非断行空格后再解析
var french = CultureInfo.GetCultureInfo("fr-FR"); input = input.Replace(' ', '\u00A0'); bool parseSuccess = DateTime.TryParseExact(input, "d MMMM yyyy", french, DateTimeStyles.None, out var parsed_date);
- 方案二:在解析参数中加入
DateTimeStyles.AllowWhiteSpaces,自动兼容不同类型的空白字符
var french = CultureInfo.GetCultureInfo("fr-FR"); bool parseSuccess = DateTime.TryParseExact(input, "d MMMM yyyy", french, DateTimeStyles.AllowWhiteSpaces, out var parsed_date);
- 方案三:如果不需要严格匹配格式优先级,直接使用适配fr-FR文化的通用解析方法
var french = CultureInfo.GetCultureInfo("fr-FR"); bool parseSuccess = DateTime.TryParse(input, french, DateTimeStyles.None, out var parsed_date);
补充说明
如果上述方案仍无效,可能是本地设备的fr-FR文化配置被用户自定义修改,可以强制获取未经修改的默认文化配置:
// 第二个参数设为false,强制使用系统默认的文化配置,忽略用户自定义修改 var french = CultureInfo.GetCultureInfo("fr-FR", false);
内容的提问来源于stack exchange,提问作者Regis Portalez
相关产品推荐
相关产品推荐

