如何解决C# WPF组合日期时间时出现String was not recognized as a valid DateTime错误
问题根因
你遇到的String was not recognized as a valid DateTime报错,核心是ToShortDateString()方法的输出格式由运行设备的系统区域设置决定,和你ParseExact方法指定的dd/MM/yyyy格式不匹配。比如中文系统默认短日期格式为yyyy/M/d,拼接后的日期字符串不符合预设解析规则,自然会抛出异常。同时如果用户输入的小时/分钟是单个数字(比如9点输入9而非09),也会和hh两位小时的格式要求冲突。
解决方案
方案1:修正字符串格式化逻辑(适配你现有的写法)
直接固定日期输出格式,同时对小时、分钟补前导零,保证拼接后的字符串完全匹配解析规则:
- 修改日期选中事件的赋值逻辑,不要用
ToShortDateString(),固定格式输出:
private void StartDate_Changed(object sender, SelectionChangedEventArgs e) { if (clnStartDate.SelectedDate.HasValue) { startDate = clnStartDate.SelectedDate.Value.Date.ToString("dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture); } } private void EndDate_Changed(object sender, SelectionChangedEventArgs e) { if (clnEndDate.SelectedDate.HasValue) { endDate = clnEndDate.SelectedDate.Value.Date.ToString("dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture); } }
- 拼接时间字符串时,对小时、分钟补两位前导零:
// 先把输入的小时、分钟转成数字再格式化 int startHr = int.Parse(txtStartTimeHr.Text); int startMin = int.Parse(txtStartTimeMin.Text); int endHr = int.Parse(txtEndTimeHr.Text); int endMin = int.Parse(txtEndTimeMin.Text); startString = $"{startDate} {startHr:D2}:{startMin:D2}:00 {selectedText2}"; endString = $"{endDate} {endHr:D2}:{endMin:D2}:00 {selectedText3}";
方案2:更推荐,完全规避字符串解析风险
不要走「转字符串→拼接→解析」的冗余逻辑,你已经有所有生成DateTime的原始数值,直接构造对象即可,永远不会出现格式类报错:
// 直接拿DatePicker的DateTime值,不需要存字符串格式的startDate/endDate DateTime startDateVal = clnStartDate.SelectedDate.Value.Date; DateTime endDateVal = clnEndDate.SelectedDate.Value.Date; // 转换时分 int startHr = int.Parse(txtStartTimeHr.Text); int startMin = int.Parse(txtStartTimeMin.Text); int endHr = int.Parse(txtEndTimeHr.Text); int endMin = int.Parse(txtEndTimeMin.Text); // 处理AM/PM if (selectedText2 == "PM" && startHr <12) startHr +=12; if (selectedText2 == "AM" && startHr ==12) startHr =0; if (selectedText3 == "PM" && endHr <12) endHr +=12; if (selectedText3 == "AM" && endHr ==12) endHr =0; // 直接构造DateTime,完全不需要Parse combinedStart = new DateTime(startDateVal.Year, startDateVal.Month, startDateVal.Day, startHr, startMin, 0); combinedEnd = new DateTime(endDateVal.Year, endDateVal.Month, endDateVal.Day, endHr, endMin, 0);
这个方案完全不受系统区域设置影响,性能也更好,适合生产环境使用。
额外优化建议
你的SqlConnection、SqlCommand对象建议套在using块中使用,会自动释放资源,避免出现连接泄漏问题。
内容的提问来源于stack exchange,提问作者Jeff Cena
相关产品推荐
相关产品推荐

