字符串转DateTime失败求助:SQL文本字段日期转换报错
解决字符串转DateTime报错“String not in datetime format”的方案
你现在的转换逻辑完全走偏了——把日期字符串去掉斜杠转成整数再转DateTime的做法根本不对,Convert.ToDateTime(int)是把整数当成OLE自动化日期值(从1899-12-30开始算的天数),不是你以为的数字格式日期(比如20240520这种),这才是报错的根源。
给你几个靠谱的解决步骤:
1. 先搞清楚数据库里的日期格式
首先得确定expiringdate字段存的字符串到底是什么格式,比如是MM/dd/yyyy(月/日/年)、dd/MM/yyyy(日/月/年)还是yyyy-MM-dd?这是正确转换的前提。
2. 正确的转换代码
最稳妥的方式:用DateTime.TryParseExact指定格式
这种方式明确告诉程序日期字符串的格式,不会因为系统地区设置出问题:
using System.Globalization; // ... 原有数据库连接代码 ... if (dataReaderxxasdf.HasRows) { string gotttenoldexp = dataReaderxxasdf["expiringdate"].ToString(); conn.Close(); // 这里替换成你数据库实际的日期格式,比如"dd/MM/yyyy" string targetFormat = "MM/dd/yyyy"; if (DateTime.TryParseExact(gotttenoldexp, targetFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out DateTime oldExpDate)) { // 转换成功后加30天,再格式化输出 DateTime newExpDate = oldExpDate.AddDays(30); string expiringdated = newExpDate.ToString("MM/dd/yyyy"); MessageBox.Show(expiringdated); } else { MessageBox.Show($"转换失败:当前日期格式不对,内容是{gotttenoldexp}"); } }
退而求其次:用DateTime.TryParse自动识别(不推荐)
如果你不确定格式,可以用这个方法尝试,但依赖系统的区域设置,可靠性不如上面的:
if (dataReaderxxasdf.HasRows) { string gotttenoldexp = dataReaderxxasdf["expiringdate"].ToString(); conn.Close(); if (DateTime.TryParse(gotttenoldexp, out DateTime oldExpDate)) { DateTime newExpDate = oldExpDate.AddDays(30); string expiringdated = newExpDate.ToString("MM/dd/yyyy"); MessageBox.Show(expiringdated); } else { MessageBox.Show($"无法识别这个日期:{gotttenoldexp}"); } }
3. 两个重要建议
- 赶紧改数据库设计:别用text存日期了,MySQL有专门的
DATE或DATETIME类型,读取的时候直接拿DateTime,根本不用转来转去。 - 你的SQL有注入风险:直接把
membersecretid拼到SQL里是高危操作,换成参数化查询:
string querysasds = "Select * from paymentrecord Where deleted='No' and membersecretid=@membersecretid order by id desc limit 1"; MySqlCommand cmasddaa = new MySqlCommand(querysasds, conn); cmasddaa.Parameters.AddWithValue("@membersecretid", membersecretid);
内容的提问来源于stack exchange,提问作者Bluevels Technology
相关产品推荐
相关产品推荐

