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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 09:39:11