C#中字符串转DateTime失败求助:提示无效DateTime格式
搞定"String was not recognized as a valid DateTime."这个报错
兄弟,你这问题一眼就能看出来——日期分割后的字段完全搞反了!咱们来捋清楚:
假设你输入的日期是类似 2024-05-20 这种yyyy-MM-dd格式,用Split('-')分割后:
delivday[0]是年份(比如"2024"),但你把它赋值给了day变量,这直接导致day变成2024,这显然超出了日期的合法范围(最多31),ParseExact不报错才怪!delivday[2]是日期(比如"20"),你却把它当成年份赋值给year,完全颠倒了字段对应关系。
修正后的代码(附带完整校验)
先确认你的输入格式是yyyy-MM-dd,然后调整字段对应关系,再加上必要的校验避免各种异常:
string deliv = DeliveryDateTextBox.Text; string[] delivday = deliv.Split('-'); // 先检查分割后是不是正好3段,防止输入格式不对导致索引越界 if (delivday.Length != 3) { MessageBox.Show("请输入正确的日期格式,比如:2024-05-20"); return; } int year, month, day; // 现在对应正确:分割后的第1段是年,第2段是月,第3段是日 bool yearValid = int.TryParse(delivday[0], out year); bool monthValid = int.TryParse(delivday[1], out month); bool dayValid = int.TryParse(delivday[2], out day); // 检查数字转换是否都成功 if (!yearValid || !monthValid || !dayValid) { MessageBox.Show("日期里有无效数字,请重新输入"); return; } // 再校验月份和日期的合法性(比如2月不能有30号) if (month < 1 || month > 12) { MessageBox.Show("月份得在1-12之间哦"); return; } if (day < 1 || day > DateTime.DaysInMonth(year, month)) { MessageBox.Show("这个月份没有这个日期呀"); return; } // 拼成dd/MM/yyyy格式,用D2确保是两位数(比如5变成05) string dtt = $"{day:D2}/{month:D2}/{year:D4}"; DateTime datet; // 用TryParseExact更安全,还能指定区域避免系统设置影响 if (DateTime.TryParseExact(dtt, "dd/MM/yyyy", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out datet)) { // 转换成功,这里继续你的jobc逻辑 jobc... } else { MessageBox.Show("日期转换失败,请检查输入格式"); }
更简洁的写法(推荐)
其实完全不用手动分割拼接,直接用TryParseExact解析原始输入就行,省得折腾:
string deliv = DeliveryDateTextBox.Text; DateTime datet; // 直接用原始输入的格式(yyyy-MM-dd)解析 if (DateTime.TryParseExact(deliv, "yyyy-MM-dd", System.Globalization.CultureInfo.InvariantCulture, System.Globalization.DateTimeStyles.None, out datet)) { // 成功后处理你的业务逻辑 jobc... } else { MessageBox.Show("请输入正确的日期格式,例如:2024-05-20"); }
几个小提醒
- 永远别忽略
TryParse/TryParseExact的返回值,它能帮你捕获各种无效输入的情况; - 用
CultureInfo.InvariantCulture代替null,避免因为系统区域设置(比如有的地区用dd/MM/yyyy,有的用MM/dd/yyyy)导致的解析错误; - 如果不确定用户输入的格式,可以多指定几个可能的格式,用
TryParseExact的重载版本传入格式数组。
内容的提问来源于stack exchange,提问作者krazyhamad
相关产品推荐
相关产品推荐

