C语言的时间函数



32位时间戳只能表示到2038年。32位编译环境下,标准库函数可显式加上64后缀,比如_time64。函数名称有大写字母的是windows系统函数。

1、time(time_t&) #include <time.h>
time_t t; time (&t); //获取1970年1月1日0时以来的秒数,此处是utc时间
time_t实际上为32位或者64位整数
因为返回也是time_t,所以也可以用t=time(0)的方式。
2、localtime(time_t) 和 gmtime(time_t)
根据time函数获得的秒数t struct tm * lt = localtime (&t); //转换为本时区时间信息
struct tm * gt=gmtime (&t); //转换为utc时间信息
其中: struct tm { int tm_sec;  //秒 int tm_min; //分 int tm_hour; //小时 int tm_mday; //日 int tm_mon; //月 int tm_year; //年 int tm_wday; //星期,其中0代表星期天,1代表星期一 int tm_yday; //从每年的1月1日开始的天数 ,其中0代表1月1日 int tm_isdst; //夏令时标识符
};
输入负数的范围有限,即使是64位函数。具体数字还没有查到。

3、mktime(struct tm*)
t=mktime(lt) //将时间结构lt转为1970年以来的秒数,也可以自己手工构建tm结构
反方向转换。此处lt为本时区时间信息。


4、GetLocalTime(SYSTEMTIME&) 获取本地时间,有毫秒 SetLocalTime(SYSTEMTIME&) 设置本地时间
SYSTEMTIME st; GetLocalTime(&st);
其中: STRUCT SYSTEMTIME  { WORD wYear ; 年 WORD wMonth ;月 WORD wDayOfWeek ;星期,0=星期日,1=星期一... WORD wDay ;日 WORD wHour ;时 WORD wMinute ;分 WORD wSecond ;秒 WORD wMilliseconds ;毫秒 }


GetSystemTime(SYSTEMTIME&)和SetSystemTime(SYSTEMTIME&) 操作的是UTC时间,其他相同。

5、void ftime(struct timeb *) #include <sys/timeb.h>
获取时间,有毫秒 struct timeb tp; ftime(&tp);       其中: struct timeb{     time_t time;   /* 为1970-01-01至今的秒数*/     unsigned short millitm; /* 毫秒 */     short timezone;  /* 时区差值,单位为分钟 */     short dstflag;   /* 夏令时标识 */   };
6、获取文件的时间信息

方法1、int stat(const char * file_name, struct stat *buf);

具体信息请自行搜索

方法2、文件查找函数_findfirst、_findnext得到_finddata_t结构数据,里面有文件的创建时间等信息。



7、clock()函数 
返回从程序启动到调用时刻的时间间隔。可用于测量两个事件之前的时间:
clock_t start, finish; double duration;

start = clock(); //...事件 finish = clock();
duration = (double)(finish - start) / CLOCKS_PER_SEC; printf( "%f seconds\n", duration );

8、gettimeofday()
int gettimeofday(struct timeval*tv, struct timezone *tz);
struct timeval{ long int tv_sec; // 1970年以来的秒数 long int tv_usec; // 微秒数 } 可以计算代码执行时间: struct timeval tv_begin, tv_end; gettimeofday(&tv_begin, NULL); //... gettimeofday(&tv_end, NULL);

9、GetTickCount()
它返回从操作系统启动到当前所经过的毫秒数,返回值以32位的双字类型DWORD存储,因此可以存储的最大值是(2^32-1) ms约为49.71天,因此若系统运行时间超过49.71天时,这个数就会归0。

10、GetSystemTimeAsFileTime(FILETIME *)
高精度。该函数返回自1601年1月1日起,到现在的时间(以 100ns 为单位)
struct _FILETIME {
DWORDdwLowDateTime;
DWORDdwHighDateTime;
} FILETIME;

获取1601年以来的微秒数:

FILETIME ft;
long long elaps_u;
GetSystemTimeAsFileTime(&ft);
elaps_u= (long long(ft.dwHighDateTime) << 32) + ft.dwLowDateTime;

11、TimeGetTime
和GetTickCount差不多。GetTickCount精度15毫秒,TimeGetTime精度为1ms

12、时间格式转换
SystemTimeToFileTime(const SYSTEMTIME *,FILETIME*) - systemtime转换成timeb
FileTimeToSystemTime(const FILETIME *,SYSTEMTIME*) - 反方向

FILETIME转换为timeb:

LONGLONG ll;
ULARGE_INTEGER ui;
ui.LowPart = ft.dwLowDateTime;
ui.HighPart = ft.dwHighDateTime;
ll = (ft.dwHighDateTime << 32) + ft.dwLowDateTime; struct timeb tmb;
tmb->time = (DWORD)((LONGLONG)(ui.QuadPart - 116444736000000000) / 10000000);
tmb->millitm=st.wMilliseconds;

13、dftime函数,计算两个time_t的时间差。感觉没什么用,直接减一下不就完了?
double difftime(time_t time2, time_t time1);

14、高精度计时:
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency) 获取系统的计数器的频率
BOOL QueryPerformanceCounter(LARGE_INTEGER *lpPerformanceCount) 获取计数器的值
然后用两次计数器的差除以频率就得到时间间隔。

15、ctime函数,把time_t输出成字符串

下一篇

你可能想看:
标签: c语言
分享给朋友: