用C语言输出当前的系统时间,在C语言库中已经提供了很多方法,有的方法能够获取到毫秒级别的时间。
很多时候,需要获取程序执行时间的时间差,那么能够精确到毫秒的时间就更为合适。
下面介绍四种方式,分别给出了实例,在输出时间的时候,需要注意各个输出数据的大小,不要超过数据所能表示的范围。
方法1,用time.h中的方法获取时间
time_t start, end;
start = time(NULL);
Sleep(1000);
end = time(NULL);
printf("start=%d\n", start);
printf("end=%d\n", end);
printf("times=%d\n", end - start);
输出如下
start=1617535664
end=1617535665
times=1
输出的时间以秒为单位,也就是说精确到为秒。
如果想要更高的精确度的话,这个显然是不合适的。
方法2,用windows.h中的方法获取时间
int start,end;
start = GetTickCount();
Sleep(1000);
end = GetTickCount();
printf("start: %d ms\n", start);
printf("end: %d ms\n", end);
printf("time: %d ms\n", end - start);
这个也是输出时间的函数,输出如下
start: 9983061538135917 ms
end: 9983061538136917 ms
time: 9983058774066152 ms
这个输出结果似乎不对,仔细看看,这些数值已经超过了int所能够表示的范围,两者相减,自然是错误的输出。
如何修改呢?请参考公众号
方法3,获取到毫秒级别的时间
LARGE_INTEGER li;
LONGLONG start, end, freq;
QueryPerformanceFrequency(&li);
freq = li.QuadPart;
QueryPerformanceCounter(&li);
start = li.QuadPart;
Sleep(3000);
QueryPerformanceCounter(&li);
end = li.QuadPart;
int useTime = (int)((end - start) * 1000 / freq);
printf("time: %d ms\n", useTime);
printf("(end - start) * 1000: %lld ms\n", (end - start) * 1000);
printf("freq: %ld ms\n", freq);
这种方式也能输出毫秒级的时间,但是一定要注意各种数据的长度,在格式控制符的选择上,一定要小心。
time: 3001 ms
(end - start) * 1000: 7017387000 ms
freq: 2338339 ms
这种方式输出的时间精度,可能没有下面这种方式的高
方法4,获取到日期等,精确到毫秒
代码放在main函数中,头文件windos.h
SYSTEMTIME currentTime;
GetSystemTime(¤tTime);
printf("time: %u/%u/%u %u:%u:%u:%u %d\n",
currentTime.wYear, currentTime.wMonth, currentTime.wDay,
currentTime.wHour, currentTime.wMinute, currentTime.wSecond,
currentTime.wMilliseconds, currentTime.wDayOfWeek);
运行输出
time: 2021/4/4 10:51:38:486 0
最后输出的0表示星期天如何求时间差?请参考公众号
这里用int类型,在VS2017中有4个字节的内存,是足够大的,如果是在2个字节的内存时,则需要用long类型返回。
以上是四种输出时间差的方式,运行环境是VS2017,Windows系统。