C# 读取数据库中时间,毫秒丢失的情况总结

本文探讨了在C#中处理DateTime类型数据时如何保留毫秒精度的问题,尤其是在与数据库交互过程中。通过实例演示了不同转换方法的效果,并推荐使用Convert.ToDateTime或直接类型转换来保持毫秒精度。

   

在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 ),再进行查询 就可以了。


完毕。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值