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输出成字符串



© time.org.cn