时间操作函数总结

C语言中提供了对时间进行操作的函数和数据结构,下面介绍几种常用的函数。
首先是表示时间的time_t类型,在32位windows VS2010中定义为long long类型,占8个字节,表示自1970年1月1日0时0分0秒到现在的秒数。
表示日期结构tm定义如下:
struct tm {
        int tm_sec;     /* seconds after the minute - [0,59] */
        int tm_min;     /* minutes after the hour - [0,59] */
        int tm_hour;    /* hours since midnight - [0,23] */
        int tm_mday;    /* day of the month - [1,31] */
        int tm_mon;     /* months since January - [0,11] */
        int tm_year;    /* years since 1900 */
        int tm_wday;    /* days since Sunday - [0,6] */
        int tm_yday;    /* days since January 1 - [0,365] */
        int tm_isdst;   /* daylight savings time flag */
};
注释已经清晰给出了各个字段的含义。
一、获取时间
   函数原型:time_t time(time_t* _Time);获取当前系统时间:time_t t = time(NULL);此时的时间是GMT时间。
二、转化时间:
   函数原型:tm* localtime(const time_t * _Time);将秒表示GMT时间转化为本地时间,并以tm结构返回,tm在localtime中实际上就是一个静态变量,因此windows下提供了更安全函数errno_t localtime_s( struct tm * _Tm, const time_t * _Time);用户必须自定义tm结构将指针传入,并且函数内部对_Tm和_Time指针检查是否为NULL,返回值如果不为0则表示输入时间不可转换。
   另一个函数:tm* gmtime(const time_t * _Time);将秒表示的GMT时间转化为tm结构表示的日期。同样该函数在windows提供了更安全的函数
errno_t gmtime_s( struct tm * _Tm, const time_t * _Time);
   看到这我们会想从tm结构到time_t函数:time_t mktime(const tm* _Tm);将时间以标准ASCII格式输出函数为char * asctime(const tm* _Tm);输出格式如:Tue Jun 04 21:35:31 2013。
另外还有像strftime格式化输出时间字符串,类似printf,只是中间占位符不同。
三、windows下更多时间函数:
   DWORD GetTickCount(VOID);获取系统启动到现在的毫秒数,但是精度好像只有55毫秒。另外一个精度更高的函数DWORD timeGetTime(VOID);据说精度达到10毫秒,同样也是系统启动到现在的毫秒数。
   还有个函数可以计时进程启动开始的时间clock_t clock();函数以毫秒为单位, clock_t是一个long类型。
   MFC中提供了CTime类对时间进行操作。CTimeSpan对时间间隔进行操作。如果需要更为精确的计时则QueryPerformanceFrequency和QueryPerformanceCounter函数可以做到,计时的单位是纳秒。
四、linux可以通过传统的C语言函数获取时间外,还提供了int gettimeofday(struct timeval *tv, struct timezone *tz);
struct timeval{
     long int tv_sec;//秒数
     long int tv_usec;//微秒数
};
可以精确获取一段代码前后执行的时间, tv_sec中保存了从1970年1月1日0时0分0秒到现在的秒数.
原文地址:https://www.cnblogs.com/ourroad/p/3117952.html