C# ParseExact解析日期失败求助:SSIS中转换特定格式日期
问题分析
你的代码转换失败的核心原因是输入字符串里的秒数是67,而DateTime类型要求秒的取值范围必须是0-59,ParseExact默认会严格校验时间分量的有效性,遇到超出范围的值就会抛出FormatException。
解决方案
根据你的场景,有两种处理思路:
思路1:修正源数据(优先推荐)
如果可以修改文件里的日期数据,把秒数调整到0-59的有效范围内,这样原来的代码只需要保留正确的格式字符串就能正常运行:
string strDate = "Oct 9 2017 2:45:07:145PM"; // 修正67为07 DateTime dtTroubleDate; dtTroubleDate = DateTime.ParseExact(strDate, "MMM d yyyy h:mm:ss:ffftt", CultureInfo.InvariantCulture); MessageBox.Show("dtTroubleDate String : " + dtTroubleDate.ToString());
思路2:手动处理无效时间分量(无法修改源数据时)
如果没办法修改文件内容,我们可以先拆分字符串,把超出范围的秒数转换为分钟和剩余秒数,再重新拼接成有效的日期字符串后解析:
string strDate = "Oct 9 2017 2:45:67:145PM"; // 拆分日期字符串获取各个部分 var parts = strDate.Split(new[] {' ', ':'}, StringSplitOptions.RemoveEmptyEntries); // 提取时间分量并转换为数值 int hours = int.Parse(parts[3]); int minutes = int.Parse(parts[4]); int seconds = int.Parse(parts[5]); int milliseconds = int.Parse(parts[6]); string amPm = parts[7]; // 处理超出范围的秒数:67秒 = 1分钟 + 7秒 minutes += seconds / 60; seconds = seconds % 60; // 处理可能超出范围的分钟(比如如果秒数是120,分钟会加2,这里做冗余处理) hours += minutes / 60; minutes = minutes % 60; // 转换12小时制为24小时制 if (amPm.Equals("PM", StringComparison.OrdinalIgnoreCase) && hours != 12) { hours += 12; } else if (amPm.Equals("AM", StringComparison.OrdinalIgnoreCase) && hours == 12) { hours = 0; } // 重新拼接成符合规则的日期字符串 string validDateStr = $"{parts[0]} {parts[1]} {parts[2]} {hours:D2}:{minutes:D2}:{seconds:D2}:{milliseconds:D3}"; // 解析修正后的字符串 DateTime dtTroubleDate; if (DateTime.TryParseExact(validDateStr, "MMM d yyyy HH:mm:ss:fff", CultureInfo.InvariantCulture, DateTimeStyles.None, out dtTroubleDate)) { MessageBox.Show("dtTroubleDate String : " + dtTroubleDate.ToString()); } else { MessageBox.Show("Failed to parse the date after correction."); }
这段代码会把2:45:67:145PM转换为14:46:07.145(因为PM的2点加12小时是14点,67秒转成1分钟7秒,所以45+1=46分钟),最终得到有效的DateTime对象。
内容的提问来源于stack exchange,提问作者rRana
相关产品推荐
相关产品推荐

