DateTime.Parse解析从数据库获取的时间字段字符串错误

最近内部测试发现在windows 32位机子上,软件启动发现日志报错,花点时间调查了一下,发现是Windows下C#从数据库读取的数据填充到DataSet里,最后通过循环遍历读取CreateTime字段,读取的数据为“2019/08/20/星期二 13:35:26”【数据库中CreateTime字段的内容为2019-08-20 13:35:26】,这串字符串丢给DateTime.Parse(“2019/08/20/星期二 13:35:26”).ToString("yyyy-MM-dd HH:mm:ss")时就会抛异常了,因为.Parse解析不了带有这样的时间格式字符串。

之后继续考究了下dr["CreateTime"].ToString获取的字符串,发现这个东西返回带有日期时间的字符串格式是windows系统日期和时间设置的组合:短日期+一个空格+长时间。

到这里基本已经有方案来处理这个bug了:

//windows系统将短日期格式设置成yyyy/MM/dd/dddd时,dr["CreateTime"]返回值为2019/08/20/星期二 13:35:26,DateTime.Parse解析就会失败
// DateTime.Parse(dr["CreateTime"].ToString()).ToString("yyyy-MM-dd HH:mm:ss")
 
var format = System.Globalization.CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern
+ " "
+ System.Clobalization.CultureInfo.CurrentCulture.DateTimeFormat.LongTimePattern;

DateTime.ParseExact(dr["CreateTime"].ToString(), format, System.Globalization.CultureInfo.CurrentCulture);

//具体的接口参数使用请参考MSDN

然后我将代码给我的领导评审,他说format的空格很奇怪,为什么是一个空格,我回答不出,我去查找MSDN文档,没找到什么,倒是发现了DateTime.Now.ToString()这个返回的也是只有一个空格,而不是两个或者三个空格。倒是有提到DateTime.Now.ToString()返回的字符串是和短日期和长时间格式,就没有解释说空格是一个空格还是两个,甚至多个,直说和当前使用的CulTureInfo有关,后面我想看微软源码来着,发现越看越深,眼看我花费在这个bug的时间快到了,就按照之前调试时发现dr["CreateTime"]对象的类型显示是object,隐式的类型是DateTime类型的想法,我就换了另一种方式,既然dr["CreateTime"]已经是DateTime类型,直接来个强转就好了:

((DateTime)dr["CreateTime"]).ToString("yyyy-MM-dd HH:mm:ss");

这个样子代码量少,改动也少。算是解决了这个bug吧。

你可能感兴趣的:(工作)