C#中转换Excel日期字符串为DateTime遇格式异常求助
解决Excel日期字符串转DateTime的格式异常问题
问题根源
- 文化信息不匹配:你的日期字符串是西班牙语格式(
Miercoles是西班牙语周三,Noviembre是西班牙语十一月),但代码里用了en-PY(巴拉圭英语)文化,无法识别西班牙语的日期词汇。 - 格式字符串与目标字符串不匹配:原字符串里的分隔词是西班牙语的
de,但你用了对应英文of的\o\f,导致格式解析失败。 - 字符串截取方式不可靠:用固定长度
Remove(dateString.Length-7)截取日期部分,一旦字符串长度变化(比如日期是个位数、时间格式不同)就会出错。
修正方案
1. 使用正确的西班牙语文化信息
替换CultureInfo.CreateSpecificCulture("en-PY")为西班牙语文化,比如es-PY(巴拉圭西班牙语)或es-ES(西班牙西班牙语),确保能识别西班牙语的星期和月份名称。
2. 调整格式字符串匹配西班牙语结构
原日期结构是"星期几, 日 de 月 de 年",所以格式字符串要写成"dddd, d 'de' MMMM 'de' yyyy",用单引号把de括起来作为字面量解析。
3. 可靠提取日期部分
改用Split或正则表达式提取日期部分,避免固定长度截取的风险:
- 用
Split按空格分割,取前7个元素拼接(因为原字符串最后两个是时间部分); - 或者用正则匹配
@"^.*\d{4}"提取到年份为止的部分。
修正后的代码
dataSet = reader.AsDataSet(); DataTable dataTable = dataSet.Tables[0]; // 使用西班牙语文化信息 var esCulture = CultureInfo.CreateSpecificCulture("es-PY"); // 匹配西班牙语日期格式的格式字符串 string format = @"dddd, d 'de' MMMM 'de' yyyy"; foreach (DataRow fila in dataTable.Rows) { string dateString = fila["Column18"].ToString().Trim(); // 可靠提取日期部分:分割后取到年份的部分 string[] parts = dateString.Split(new[] {' '}, StringSplitOptions.RemoveEmptyEntries); if (parts.Length >= 6) // 确保有足够的部分组成日期 { string datePart = string.Join(" ", parts.Take(6)); if (DateTime.TryParseExact(datePart, format, esCulture, DateTimeStyles.None, out DateTime date)) { Console.WriteLine(date); } else { Console.WriteLine($"无法解析日期: {dateString}"); } } }
额外说明
如果你的Excel里的日期实际上是可识别的日期格式(而非纯字符串),可以尝试设置AsDataSet的配置,让ExcelDataReader直接读取为DateTime类型,避免手动转换:
var config = new ExcelDataSetConfiguration() { ConfigureDataTable = (_) => new ExcelDataTableConfiguration() { UseHeaderRow = true, ReadDateTimes = true // 直接读取日期类型 } }; dataSet = reader.AsDataSet(config);
内容的提问来源于stack exchange,提问作者ISeeMangos
相关产品推荐
相关产品推荐

