C#提取字符串日期部分报错:无法将string转换为IFormatProvider
解决方法:提取日期字符串中的纯日期部分
你遇到的错误原因很明确——你直接对string类型调用了ToString("dd/MM/yyyy"),但string的ToString方法根本不支持传入格式字符串参数,编译器把你传入的格式字符串当成了IFormatProvider类型的参数,自然就报错了。
要正确提取纯日期部分,核心思路是先把数据转换成DateTime类型,再对日期对象进行格式化。这里给你两种靠谱的解决方案:
方案一:直接从数据库读取为DateTime(推荐)
如果你的数据库字段本身是日期/时间类型(比如SQL Server的datetime、date等),别先转成字符串,直接读取为DateTime对象是最准确的:
// 用GetDateTime直接读取日期字段,避免字符串转换的麻烦 DateTime datCommissioned = rdr.GetDateTime(4); // 格式化只保留日期部分 string dateOnly = datCommissioned.ToString("dd/MM/yyyy"); // 或者如果你只需要日期(时间设为00:00:00),可以用Date属性 string dateOnly = datCommissioned.Date.ToString("dd/MM/yyyy");
方案二:从现有字符串解析为DateTime再格式化
如果已经拿到了带时间的字符串,需要先把它解析成DateTime对象,再格式化:
string datCommissioned = rdr.GetValue(4).ToString(); // 按照你的字符串格式(比如"2/05/2018 6:54:00 AM")指定解析规则 // 注意格式要和输入字符串完全匹配:d代表一位/两位日,h代表12小时制的一位/两位小时,tt代表AM/PM DateTime dateTime = DateTime.ParseExact( datCommissioned, "d/MM/yyyy h:mm:ss tt", System.Globalization.CultureInfo.InvariantCulture ); string dateOnly = dateTime.ToString("dd/MM/yyyy");
这里一定要确保解析用的格式字符串和你的输入字符串格式完全对应,比如你的示例中日是一位数(2),所以用d而不是dd;小时是一位数(6),用h而不是hh。加上CultureInfo.InvariantCulture可以避免不同地区的日期格式影响解析结果。
内容的提问来源于stack exchange,提问作者matt daemon
相关产品推荐
相关产品推荐

