You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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:修正字符串格式化逻辑(适配你现有的写法)

直接固定日期输出格式,同时对小时、分钟补前导零,保证拼接后的字符串完全匹配解析规则:

  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);
    }
}
  1. 拼接时间字符串时,对小时、分钟补两位前导零:
// 先把输入的小时、分钟转成数字再格式化
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 04:24:01