Linux C时间、日期函数总结框架

Linux 系统时间和日期函数

总览

各函数之间关系

其他相关时间函数:

ctime

将日期和时间转化成ASCII时间.

#include <time.h>

char *ctime(const time_t *timep);
char *ctime_r(const time_t *timep, char *buf);
  • 功能
    ctime(t) <=> asctime(localtime(t)), 转化calendar time t为一个null终结符, 其形式: "Wed Jun 9 15:03:10 2021\n"
    ctime_r功能与ctime类似, 不过是将字符串存储到提供的缓存buf中, 要求其大小至少26byte

  • 参数
    ctime的参数是time_t类型的. time_t类型代表的是UTC时间, 即Epoch, 1970-01-01 00:00:00 +0000 (UTC) 到指定值的秒数.

  • 返回值
    ctime返回指定参数的UTC时间字符串
    ctime_r返回的UTC字符串内容同, 字符串地址就是buf地址

示例: 获取并打印当前时间UTC字符串

// 使用ctime
time_t stime;
time(&stime); // time()返回当前时间, time_t类型
char *s = ctime(&stime);
printf("%s\n", s);

// 使用ctime_r
char buf[26] = {0};
char *s2 = ctime_r(&stime, buf);
printf("%s\n", buf);
printf("%s\n", s2);

printf("buf@%d return@%d\n", buf, s2);

运行结果:

Wed Jun  9 15:23:51 2021

Wed Jun  9 15:23:51 2021

Wed Jun  9 15:23:51 2021

buf@1810803008 return@1810803008

asctime

将日期和时间, 转换成ASCII时间

#include <time.h>

char *asctime(const struct tm *tm);
char *asctime_r(const struct tm *tm, char *buf);
  • 功能
    asctime(tm)将细分时间tm转化成UTC时间字符串, 字符串形式同ctime;
    asctime_r(tm)功能同asctime, 不过会把字符串存入buf中;

  • 参数
    tm 包含了细分时间的各项值信息, 主要是年月日时分秒等, 其定义如下:

struct tm {
   int tm_sec;    /* Seconds (0-60) */
   int tm_min;    /* Minutes (0-59) */
   int tm_hour;   /* Hours (0-23) */
   int tm_mday;   /* Day of the month (1-31) */
   int tm_mon;    /* Month (0-11) */
   int tm_year;   /* Year - 1900 */
   int tm_wday;   /* Day of the week (0-6, Sunday = 0) */
   int tm_yday;   /* Day in the year (0-365, 1 Jan = 0) */
   int tm_isdst;  /* Daylight saving time */
};
  • 返回值
    类同ctime.

clock

获取处理器时间, 常用于计算算法运行时间. 简单说, 就是处理器当前跑过的时钟数, 2个时间点对应时钟数相减, 就能得到这段时间所花费的时钟数, 如果能知道每个时钟所代表的时间含义, 就能求出具有实际物理意义的时间(秒/微妙等).
CLOCKS_PER_SEC 就是这样一个参数, 定义在<time.h>, 表示每秒钟的时钟数.

注意: sleep时, 进程会放弃CPU资源, 也就是说sleep所花费的时间, 不会计算在内.

#include <time.h>

clock_t clock(void);

示例: 计算算法所花费的时间

clock_t sclock;
clock_t eclock;
volatile int cnt = 0;

sclock = clock();

/* sleep 时间不会耗费clock */
sleep(2);

/* 1亿次 */
for (int i = 0; i < 1000000000; ++i) {
    cnt++;
}

eclock = clock();
printf("time = %lf seconds\n", (eclock - sclock) / (double )CLOCKS_PER_SEC);

运行结果, 也表明, 利用sleep进程休眠了2s, 但最终运行时间计算结果 < 1s, 也就是说, sleep耗费时间不会计算在clock方式计算得到的时间.

time = 0.251695 seconds
posted @ 2021-05-19 20:50  明明1109  阅读(455)  评论(0编辑  收藏  举报