加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

年月日时间和64位时间的使用及相互相转换

(2011-10-16 23:48:27)
标签:

杂谈

http://blog.csdn.net/chenlycly/article/details/5866972


通常在我们的VC程序中,界面上要显示年月日类型的时间,而将对应的64位类型的时间存储到数据库中,数据库中对应的时间字段的类型则为big int数据类型。代码中会涉及到如何获取当前时间,以及年月日时间和64位时间之间的转换问题。下面就自己遇到的实际情况,做一个小的总结。

 

1. 获取当前时间


       获取当前时间的时间有多种,下面说说使用time函数,使用CTime类和使用SYSTEMTIME结构体这三种常见的获取当前时间的方法。

 

(1)使用time函数获取当前时间

      使用该函数的时候应该包含time.h头文件,使用该函数获取当前的64位时间最为简单。

  1. __time64_t curTime ::time(NULL);  
 

     该方法在线程函数中比较实用,可以进行时间上的控制,通常线程函数都是一个循环体,在每次循环开始的时候,都获取一下当前的时间,比如:

(i)在客户端的一个线程中,一方面要定时地给服务器发送心跳包数据(假如每隔10秒),另一方面又要进行其他的数据收发工作,而这些数据又要实时 的的收发,所以在该线程中不能等待10秒钟后发送心跳包,然后再收发其他的数据,这个时候我们就可以定义一个__time64_t类型的时间变量,记录最 后一次发送心跳包的时间,这样在线程函数的循环中,每次循环只需要等待一个微小的时间就进入下一次循环,在实时收发数据的同时判断当前时间离最后一次发心 跳包的时间间隔是否已经到达10秒,若到达则发送新的心跳包,并更新最后一次心跳包发送的时间。

(ii)在视频监控系统中,有计划录像的概念,那录像的计划是如何实现的呢?是如何进行调度的呢?这里就简要的说明一下,开启一个录像调度的线程, 在该线程中遍历录像对象列表,对象中包含录像计划的开始时间和结束时间,当当前时间大于或等于开始录像时间时,就开始录像,当当前时间大于或等于结束录像 时间时,就结束录像。

 

(2)使用CTime类获取当前时间

        由于该方法使用到CTime MFC类,所以只能应用于MFC的工程中。首先定义一个CTime类对象,然后调CTime::GetCurrentTime()获取当前时间,最后利用 GetYear( ),GetMonth( ), GetDay( ), GetHour( ), GetMinute( ), GetSecond( )函数得到具体的年月日信息。

  1. CTime curTime;  
  2. curTime CTime::GetCurrentTime();  
  3. CString strCurTime;  
  4. strCurTime.Format(_T("d/d/d d:d:d"), curTime.GetYear(), curTime.GetMonth(), curTime.GetDay(), curTime.GetHour(), curTime.GetMinute(), curTime.GetSecond());  
  5. ......//将时间显示出来  

 

(3)使用SYSTEMTIME结构体获取当前时间

         与CTime类处理的类似,先定义一个结构体对象,然后调用GetLocalTime函数来获取当前时间,结构体对象的成员中则包含有年月日信息。与CTime类不同的是,该方法可以应用与MFC工程中,也可以用于Win32工程中。

  1. SYSTEMTIME curTime;  
  2. GetLocalTime(&curTime);  
  3. CString strCurTime;  
  4. strCurTime.Format(_T("d/d/d d:d:d"), curTime.wYear, curTime.wMonth, curTime.wDay, curTime.wHour, curTime.wMinute, curTime.wSecond);  
  5. ......//将当前时间显示出来  

 


2. 年月日时间和64位时间的相互转化

 

       64位时间保存到数据库是很方便的,之前也有很多人问过如何将年月日时间保存到数据库中,我觉得将他们转化为64位时间后在保存到数据库中比较好,数据库 中只要有一个big int时间字段就可以了,这样不仅简化了时间的保存方法,还有利于数据表的排序查询。界面中数据要保存到数据库中,要将之转化为64为时间;从数据库中读 出64为时间,要将之转化为年月日时间在界面上显示出来。

 

(1)使用CTime类实现年月日时间和64位时间的相互转化

(i)年月日时间转化为64位时间: 构造CTime类对象时,将年月日信息作为构造参数。

  1. CTime thatTime(2010, 10, 06, 19, 22, 55);  
  2. __time64_t thatTime_64t thatTime.GetTime();  

(ii)64位时间转化为年月日时间: 构造CTime类对象时,将64位时间作为构造参数。

  1. __time64_t tahtTime;  
  2. ......//中间处理,获取64位时间  
  3. CTime ctThatTime(tahtTime);  
  4. CString strThatTime;  
  5. strThatTime.Format(_T("d/d/d d:d:d"), ctThatTime.GetYear(), ctThatTime.GetMonth(), ctThatTime.GetDay(), ctThatTime.GetHour(), ctThatTime.GetMinute(), ctThatTime.GetSecond());  
  6. ......  

        上述方法适用于MFC工程中,而在非MFC的工程中则要使用到tm结构体。

 

(2)使用tm结构体实现年月日时间和64位时间的相互转化

(i)年月日时间转化为64位时间: 首先使用SYSTEMTIME结构体来获取当前的时间,然后利用tm结构体将获得年月日时间转化为64位时间。

  1. SYSTEMTIME curTime;  
  2. GetLocalTime(&curTime);  
  3. struct tm tmTime;  
  4. tmTime.tm_year curTime.wYear 1900;  
  5. tmTime.tm_month curTime.wMonth;  
  6. tmTime.tm_day curTime.wDay;  
  7. tmTime.tm_hour curTime.wHour;  
  8. tmTime.tm_minute curTime.wMinute;  
  9. tmTime.tm_second curTime.wSecond;  
  10. __time64_t curTime_64t _mktime64(&tmTime);   

(ii)64位时间转化为年月日时间: 首先将64位时间转化为tm结构体时间,然后再转化成年月日时间。

  1. __time64_t tahtTime;  
  2. ......//获取64位时间  
  3. tm *tmThatTime _localtime64(&thatTime);  
  4. char cThatTime[30];  
  5. memset(cThatTime, 0, 30);  
  6. sprintf(cThatTime, "d/d/d d:d:d"tmThatTime->tm_year+1900, tmThatTime->tm_month+1, tmThatTime->tm_day, tmThatTime->tm_hour, tmThatTime->tm_minute, tmThatTime->tm_second);  
  7. ......  

 


0

阅读 收藏 喜欢 打印举报/Report
前一篇:无题
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有