You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动