.Net中的DataTime类型 和 time_t类型转换

来源:互联网 发布:网络爸爸 下载 编辑:程序博客网 时间:2024/06/10 20:14
 

今天碰到一个问题:数据库表中一个记录时间的FIELD是用time_t类型,也就是long类型存储的,需要转换为yyyy-MM-dd HH:mm:ss格式显示到界面上。

当初用time_t类型大概是为了提高存取效率,但现在却给我留了个麻烦。如果开发工具还用VC当然就简单了,有MFC的CTime类,也可以用tm等结构做转换。但问题是现在要用c#,一个我还不大会用的家伙……。

上网查了查,有个DateTime的时间类可用。值范围在0001-01-01 0:0:0 ~9999-12-31 23:59:59内(晕,人类能生存到公元9999年?)表示的也还是格林威治时间。类的构造方法中有一个刚好是用long类型做参数,我把2006-8-2 0:0:0的time_t值1154448000仍了进去。代码是这样的:

long lT = 1154448000;

DateTime date = new DateTime( lT );

date.ToLocalTime(); //从格林威治转换为本时区的时间

string strTime = dT.ToString(“yyyy-MM-dd HH:mm:ss”);

运行后一看 时间是0001-01-01 00:01:55,差了两千多年。想了想可能有两个问题:上time_t的起始时间 1970-1-1 0:0:0,这个基准时间大概得加进去;另外查了下MSDN DateTime是用 100 毫微秒为计量单位,而time_t的计量单位是秒,大概还要乘上 1后面多少0 才对。于是我改了下代码:

long lT = 1154448000;

lT *= 100000000

DateTime date = new DateTime(1970,1,1,0,0,0);

TimeSpan ts = new TimeSpan( lT );

date.AddTicks( ts );

date.ToLocalTime(); //从格林威治转换为本时区的时间

string strTime = dT.ToString(“yyyy-MM-dd HH:mm:ss”);

运行后发现时间 是1970-1-1 0:0:0,也就是说new DateTime后面的语句都白写了,郁闷。又仔细看了看AddTicks和ToLocalTime方法,是有返回值的,好吧,返回值分别都赋值给Date。再运行,呵呵,时间总算正常了。一大堆代码就实现这么个微不足道的要求,感觉很不爽,不行,得再省省。我在调试模式下把DateTime(1970,1,1,0,0,0)的long值copy出来,这就好办了。最终的实现代码是:

long lT = 1154448000;

lT = lT * 100000000 + 621355968000000000;

DateTime date = new DateTime(lT);

date = date.ToLocalTime();

string strTime = dT.ToString(“yyyy-MM-dd HH:mm:ss”);

原创粉丝点击