C#中使用DateTime.ParseExact解析字符串为DateTime时抛出异常求助
解决DateTime.ParseExact格式匹配异常的排查方案
看起来你遇到的问题特别让人挠头——明明格式字符串和目标字符串肉眼看完全匹配,却还是抛出了FormatException。咱们一步步拆解可能的原因和解决办法:
1. 排查字符串中的"空格"是否为普通半角空格
CSV文件里经常会出现隐藏的特殊字符,比如全角空格、制表符(Tab)或者不可见的控制字符,这些都会让匹配失败。你可以先输出日期字符串每个字符的ASCII码来验证:
foreach (char c in t.columns[0]) { Console.WriteLine($"'{c}' 的ASCII码: {(int)c}"); }
普通半角空格的ASCII码是32,如果看到其他数值(比如全角空格是12288),那问题就出在这了——你需要先把这些特殊空格替换成普通空格:
var cleanedDateStr = t.columns[0].Replace('\u3000', ' '); // 替换全角空格
2. 检查字符串前后是否有隐藏空白
有时候CSV导出时会在字段前后自动添加空格、换行符或者回车符,导致字符串实际长度比你看到的长。可以先对字符串做Trim()处理再解析:
DateTime.ParseExact(t.columns[0].Trim(), formatString, CultureInfo.InvariantCulture, DateTimeStyles.None)
如果Trim之后解析成功,说明确实存在多余的空白字符;如果Trim后长度不对(比如变成14位),那就要检查CSV文件的字段格式了。
3. 允许空白字符的容错解析
试试指定DateTimeStyles.AllowWhiteSpaces参数,这个选项会允许字符串中存在额外的空白(比如多个空格),有时候能解决肉眼看不到的空白问题:
DateTime.ParseExact(t.columns[0], formatString, CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces)
4. 验证格式本身是否正确(排除CSV读取问题)
先把解析逻辑抽出来,用硬编码的测试字符串验证格式本身没问题:
string testDate = "20110102 170100"; string format = "yyyyMMdd HHmmss"; try { var dt = DateTime.ParseExact(testDate, format, CultureInfo.InvariantCulture, DateTimeStyles.None); Console.WriteLine("解析成功:" + dt); } catch (FormatException ex) { Console.WriteLine(ex.Message); }
如果这段代码能正常运行,说明问题不在格式字符串上,而是CSV读取时的列分割错误——比如Split(';')没有正确拆分出日期列(比如CSV里有转义的分号,或者字段被引号包裹),这时候你需要检查t.columns[0]实际输出的内容是不是真的是20110102 170100。
内容的提问来源于stack exchange,提问作者Baguette




