在C语言中获取时间

Last Updated: 2023-09-25 14:32:37 Monday

-- TOC --

用C标准库<time.h>中的函数接口timectime,就可以分别获得当前系统时间的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

gmtimelocaltime会将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;
}

本文链接:https://cs.pynote.net/sf/c/202206211/

-- EOF --

-- MORE --