Last Updated: 2023-09-25 14:32:37 Monday
-- TOC --
用C标准库<time.h>
中的函数接口time
和ctime
,就可以分别获得当前系统时间的UNIX秒数,和一个标准格式的时间字符串(带\n
)。
#include <stdio.h>
#include <time.h>
int main() {
time_t now;
time(&now);
printf("%ld\n", now);
printf("%s", ctime(&now));
return 0;
}
我测试时的输出如下:
1657373932
Sat Jul 9 21:38:52 2022 # local
gmtime
和localtime
会将time_t
类型转换成struct tm
类型,可以用asctime
接口来显示:
#include <stdio.h>
#include <time.h>
int main(){
time_t now;
time(&now);
printf("%d\n", now);
printf("%s", asctime(gmtime(&now)));
printf("%s", asctime(localtime(&now)));
return 0;
}
输出:
Mon Sep 25 12:27:08 2023 # UTC
Mon Sep 25 20:27:08 2023 # local
asctime和ctime输出的字符串格式完全一样,只是对输入类型要求不同。strftime
接口可用来自定义时间字符串的输出格式:
#include <stdio.h>
#include <time.h>
#include <string.h>
int main(){
time_t now;
time(&now);
char buf[64] = {0};
strftime(buf, 64-1, "%Y-%m-%d %H:%M:%S", localtime(&now));
printf("%s\n", buf);
memset(buf, 0, 64);
strftime(buf, 64-1, "%Y-%m-%d %H:%M:%S", gmtime(&now));
printf("%s\n", buf);
return 0;
}
输出:
2023-09-25 20:33:42
2023-09-25 12:33:42
strftime接口有丰富的格式化控制参数,具体请参考manpage。
以上所有接口都有点缺陷,没有毫秒!
使用接口gettimeofday
(在<sys/time.h>
头文件中申明)可以拿到毫秒:
#include <stdio.h>
#include <sys/time.h>
int main() {
struct timeval now;
gettimeofday(&now, NULL);
printf("%ld.%ld\n", now.tv_sec, now.tv_usec);
return 0;
}
输出:
1657374322.420748
timeval结构体中的now.tv_usec
成员不仅仅是毫秒,它精确到了微秒!
另一个藏在
<unistd.h>
中的常用接口是sleep
。
C标准库<time.h>
中还有个常用的clock
函数接口,在Linux,它能够返回从进程启动开始后的CPU时间。这个接口的返回值除一个常量CLOCKS_PER_SEC
,就可以得到秒。
#include <stdio.h>
#include <time.h>
#include <unistd.h>
int main(){
printf("CLOCKS_PER_SEC = %ld\n", CLOCKS_PER_SEC);
for(int i=0; i<8; ++i){
printf("%.4fms\n", ((double)clock())/CLOCKS_PER_SEC*1000);
sleep(1);
}
return 0;
}
输出:
CLOCKS_PER_SEC = 1000000
0.5350ms
0.5890ms
0.6620ms
0.7360ms
0.8150ms
0.8920ms
0.9650ms
1.0370ms
在Windows平台,clock接口得到的是Wall Clock Time。
用clock封装了一个测试CPU时间的小工具
#include <stdio.h>
#include <time.h>
#include <stdint.h>
uint64_t clock_sofar_ms(int toc){
static clock_t tic = 0;
uint64_t r = 0;
if(toc == 0)
tic = clock();
else
r = (clock()-tic)/(CLOCKS_PER_SEC/1000);
return r;
}
int main(){
clock_sofar_ms(0);
double a = 1234;
double b = 5678;
double c = 1;
for(int i=0; i<4; ++i){
for(int j=0; j<100000000; ++j)
c = (b+i)/(a+j)/c;
printf("%lums\n", clock_sofar_ms(1));
clock_sofar_ms(0);
}
return 0;
}
clock_sofar_ms(0)
表示开始计数,ticclock_sofar_ms(1)
表示结束计数,toc,返回毫秒数,uint64_t类型。本文链接:https://cs.pynote.net/sf/c/202206211/
-- EOF --
-- MORE --