在C#中,当我们将一个DateTime类型的数据保存到数据库中再读取出来时,将数据库的结果放在DataTable中,结果发现日期精度丢失毫秒。
这是因为,读出来的结果都成了Object类型,而我们通常的做法是:
foreach (DataRow dr in dt.Rows) {
string CreaTime = dr["CreateDate"].ToString();
DateTime CreatDate = DateTime.Parse(CreatTime);
//todo something else...
}
这个时候获取的时间,已经丢失了毫秒。这是因为dr["CreateDate"] 为Object类型的 ,在进行ToString之后,丢失了毫秒。
转化为DateTime的时候,DateTime.Parse(string s),里面的参数是字符串,因此,我们DateTime.Parse转化之前,已经丢失了毫秒了。
下面分别验证一下:
private void btnTestToString_Click(object sender, RoutedEventArgs e) { StringBuilder strB= new StringBuilder(); //先验证是否object.tostring()之后,把毫秒给去掉了 DateTime time = new DateTime(2014, 3, 5, 14, 23, 20, 100); Object obj = time; DateTime time1 = DateTime.Parse(obj.ToString()); strB.Append("1、Object.ToString,Result:" + time1.Millisecond.ToString() + "\n"); //再看DateTime.Parse是否把毫秒给去掉了。 DateTime time2 = DateTime.Parse("2014-03-05 14:23:20.100".ToString()); DateTime time3 = DateTime.Parse("2014-03-05 14:23:20.100"); strB.Append("2、DateTime.Parse,Result:" + time2.Millisecond.ToString() + "\n"); strB.Append("3、DateTime.Parse,Result:" + time3.Millisecond.ToString() + "\n"); //从上面的测试结果看来是Object.ToString()的时候,给去掉了毫秒 //下面换换Convert DateTime time4 = Convert.ToDateTime(obj); strB.Append("4、Convert.ToDateTime,Result:" + time4.Millisecond.ToString() + "\n"); DateTime time5 = (DateTime)(obj); strB.Append("5、(DateTime),Result:" + time5.Millisecond.ToString() + "\n"); TT.Text = strB.ToString(); }
结果:
从测试结果看来,只有在使用Convert.ToDateTime(或者(DateTime)转)对Object对象转化的时候,才能够保留日期的毫秒。
直接使用Object的ToString()方法,会时毫秒丢失。
因此,如果需要保留毫秒的话,需要按照如下来做:
foreach (DataRow dr in dt.Rows) {
string CreaTime = dr["CreateDate"].ToString();//CreaTime 的值丢失毫秒了。
//下面会保留毫秒:
DateTime CreatDate = Convert.ToDateTime(dr["CreateDate"]); //或者:
DateTime CreatDate = (DateTime)(dr["CreateDate"]);
//转成字符串输入时包含毫秒的写法,可以这样: string strTime = CreatDate.ToString("yyyy-MM-dd HH:mm:ss.fff");
//todo something else...
}
补充:如果,传过来的日期是去掉了毫秒的日期,而数据库中的日期是包含毫秒的(比如yyyy-MM-dd HH:mm:ss.fff,由于去掉了毫秒,那么在根据时间查询的时候,总会多获取到这条数据),这个时候,我们把查询的日期条件,转化一下:CONVERT(varchar(40) , CreateDate, 120 ),再进行查询 就可以了。
完毕。