使用C# Lambda查询时将Excel字符串转为DateTime遇错求助
解决ACE.OLEDB读取Excel日期字符串在Lambda查询中的解析异常
问题根源
- 空引用异常(
String reference not set to an instance of a String.):存在Date of Birth字段值为null的行,直接调用DateTime.Parse时传入了null参数,触发异常。 - 格式解析异常(
String was not recognized as a valid DateTime.):部分行的字符串不符合DD MMM YYYY格式(比如含多余空格、月份缩写错误、非日期内容等),Convert.ToDateTime无法正常解析。
解决方案
使用DateTime.TryParseExact方法,它既能精准匹配指定日期格式,又不会因无效值抛出异常,同时提前过滤null/空字符串:
var cultureInfo = new CultureInfo("en-GB"); // 匹配DD MMM YYYY格式,注意小写dd(日)、yyyy(年),MMM是月份英文缩写 const string dateFormat = "dd MMM yyyy"; var getOldDates = dt .AsEnumerable() .Where(row => { var dateStr = row.Field<string>("Date of Birth"); // 先过滤null或空字符串的行 if (string.IsNullOrWhiteSpace(dateStr)) return false; // 尝试精准解析日期,Trim()处理字符串前后可能存在的空格 if (DateTime.TryParseExact(dateStr.Trim(), dateFormat, cultureInfo, DateTimeStyles.None, out var dob)) { return dob.Date.Year == 1900; } // 解析失败的行直接排除 return false; });
额外说明
- 如果需要保留解析失败的行,可以在Where逻辑中添加自定义处理(比如标记为无效日期),而不是直接返回false。
- 确保
dateFormat与Excel中的日期格式完全匹配,MMM会自动兼容月份缩写的大小写差异(如Jan或JAN)。
内容的提问来源于stack exchange,提问作者Anthony
相关产品推荐
相关产品推荐

