Windows/Linux下C/C++时间函数全攻略

摘要:
事实上,我们发现win2000及以下平台不够准确,无法立即返回!在使用中,COleDatetime基于此类型进行处理。在ADO数据库编程中,时间字段返回相同的类型,但这两种转换都存在严重的数据丢失问题!

1、通用处理:time_t(win平台64位系列对应__time64_t,Linux暂无研究,以后补上)
time_t=long int,范围从1970-1-1 0:0:0 到2038-1-18 19:14:07
__time64_t=__int64,范围从1970-1-1 0:0:0 到3000-12-31 23:59:59
这个变量每一秒增加1,精度很低。但是已经可以处理常用时间问题了:


    A、获取当前时间: 
            time_t ttime=time(NULL);
            __time64_t ttime=_time64(NULL);
    B、转换time_t到可以识别的结构struct tm:
            struct tm *ptm=localtime(&ttime);
            或者 struct tm *ptm=gmtime(&ttime);
            struct tm *ptm=_localtime64(&ttime);
            或者 struct tm *ptm=_gmtime64(&ttime);
    C、获取时间差:
            double difftime(time_t tm1,time_t tm2);
    D、创建:
            time_t mktime(struct tm*ptm);
            __time64_t _mktime64(struct tm*ptm);
    E、拼装字符串:
        size_t strftime(char*strDest,size_t maxsize,const char*format,const struct tm*timeptr);
        size_t wcsftime(wchar_t*strDest,size_t maxsize,const wchar_t*format,const struct tm *timeptr);
     说明:
            time_t时间范围有限,到2038年将面临第2次千年虫危机
            struct tm结构要注意:tm_year从1900年计数,tm_mon月份从0计数
            对于struct tm *,由于是栈对象的直接使用,所以一次只能使用一个,即:
            struct tm *ptm1=_localtime(&ttime1);
            struct tm *ptm2=_localtime(&ttime2);
            即使ttime1和ttime2不是一个时间,得到的ptm1也是等于ptm2的!  

2、Win32 Platform SDK:
        A、SYSTEMTIME结构:
            void GetSystemTime( LPSYSTEMTIME lpSystemTime);
            void GetLocalTime(LPSYSTEMTIME lpSystemTime);
            BOOL SetSystemTime(const SYSTEMTIME* lpSystemTime);
        B、FILETIME结构(由GetFileTime函数或者FindFirstFile函数获得),与SYSTEMTIME结构相互转换:
            BOOL FileTimeToSystemTime(const FILETIME* lpFileTime,LPSYSTEMTIME lpSystemTime);
BOOL SystemTimeToFileTime(const SYSTEMTIME* lpSystemTime,LPFILETIME lpFileTime);

3、Win32平台:
        DWORD GetTickCount(void);
        计数机器启动至今毫秒数,对于一般精度已经足够表示了。要注意:
        A、最多只能计数49.7天,如果windows这么长还未重启,计数失效
        B、这个是以5秒92下的机器计数为基础的,所以精度只能精确到百毫秒,需要更高精度,请看下面:

4、终极精度时间函数:
            A、win32:
                  LARGE_INTEGER li={0};
                  QueryPerformanceCounter(&li);
                  li.QuadPart返回的是机器计数微妙!
            B、linux:
                  struct timeval tv={0};
                struct timezone tz={0};
                  gettimeofday(&tv,&tz);
                  其中tv.tv_sec存储秒信息,tv.tv_usec存储微妙信息
            C、对于select函数,参数timeval可以精确到微妙等待,本来以为所有平台都会因此有延时功能。实际中却发现,win2000及以下平台居然是精度不够立即返回!造成无间断循环导致CPU 100%!所以跨平台编程时,建议此函数慎用!

5、win32的DATE类型
      其实DATE=double,整数部分保存1900-1-1以来天数,小数部分保存微妙数
      可以通过以下函数与SYSTEMTIME相互转换:
      INT VariantTimeToSystemTime(double vtime,LPSYSTEMTIME lpSystemTime);
      INT SystemTimeToVariantTime(LPSYSTEMTIME lpSystemTime,double*pvtime);                 
      也可以通过COleDatetime类进行处理。使用中,COleDatetime便是以此类型作为基础处理,同时ADO数据库编程中,时间字段返回的也是这个类型
      但是这两种转换都存在重大数据丢失问题!最终都只能保留到秒信息,毫秒信息没了,而且还对毫秒做了四舍五入运算!
      如果是数据库编程设计这种高精度,就不能使用ADO了,只能用ODBC和OLE DB

6、MFC中有两个类:COleDatetime(以DATE为基础),CTime(以__time64_t为基础)
      如果绑定的是日期型控件,一定要用COleDatetime!虽然CTime可以精确到3000年,但是超过这个范围,CTime是要抛出异常,让你程序崩溃的!

免责声明:文章转载自《Windows/Linux下C/C++时间函数全攻略》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇10 款很有创意的 jQuery 表格插件Linux (三)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

高通驱动树中的GPIO详解

高通驱动树中的GPIO详解DriveStrength&&tri-state相关概念DriveStrength:表示“驱动强度”。实质电路分析时高阻态可做开路理解。也就是说理论上高阻态不是悬空,它是对地或对电源电阻极大的状态。表示方法高阻态常用字母Z表示。与gpio子系统的交互虽然pinctrl提供了pinctrl_request_gpio()...

SQLserver 获取当前时间

选择CONVERT(varchar,GETDATE())--2017selectDATENAME(YEAR,GETDATE())--2017selectDATEPART。获取当前月份--05或5selectDATENAME(MM,...

Idea常用插件整合

官方网站:https://plugins.jetbrains.com/plugin/228-sql-query-plugin6.IdeaVim基于IntelliJ的Vim仿真插件。注意:如果打开WebInspector,那么CSS/JavaScript同步和元素高亮显示不起作用“pluginisdebuggingthistab”信息栏的可用性问题官方网站:h...

RedisTemplate

在SpringBoot@RequestMapping(“/del/{key}”)publicStringdel(@PathVariable(“key”)Stringkey){try{//当该键不存在时,异常redisTemplate.delete(key);return“Success”;}将不会引发catch(Exceptione){returne.get...

selenium自动化之鼠标操作

,selenium为我们提供了一个处理此类事件的类——ActionChains。ActionChains可以模拟鼠标操作,例如单击、双击、右键单击、拖动等。鼠标移动时演示页面的截图:demo1.使用鼠标移动到WriteonOver按钮的顶部。python脚本如下:读取鼠标移动代码,首先定义浏览器驱动程序,最大化窗口,打开测试页面URL,定位到测试按钮顶部,定...

登陆脚本

#!' num_ count+=1其他:lock_ input(用户名)#############1##########_###!...