c语言处理时间和日期

Forums: 

img: 

处理时间和日期很常用, 比如 me 们想简单看一下程序跑的有多快, 比如 me 们想记录日志(通常包括时间),再比如 me 们想知道今天星期几等。 c 的标准库 time.h 提供了处理时间和日期的类型和函数。 先说说 me 的感受吧, c time.h 中提供的日期处理中大量使用了内置于函数的 static 数据,这对于单线程程序来说无所谓,no problem, 但是总让人赶脚不爽 —— 非线程安全。 其次, c 提供的统计时间的函数有时候比较粗糙, 使用 time() 函数基本上只能统计到秒一级, 使用 clock() 函数可以统计到 1/CLOCKS_PER_SEC 秒一级(me 的一个实现是毫秒)。还是让 me 们说正事。

类型

time.h 定义了三种类型和 9 个函数, 内容很少, 不过功能很全。 三种类型: clock_t、time_t 和 struct tm , 前两种是算术类型,也就是类似于 int 或是 double 的类型, 通常应该是整型; 第三种是一个结构体,将日期分离开来。 clock_t 是计算的 cpu 时间, time_t 是日历时间, struct tm 是字段分离的日历时间表示。

struct tm 有年、月、日、时、分、秒、周几、第几天和是否是夏时令几个字段,具体分别是:tm_year 、tm_mon 、 tm_mday 、tm_hour 、tm_min 、 tm_sec、 tm_wday、 tm_yday 和 tm_isdst 。

函数

time.h 中有 9 个函数,获取时间点的是 clock,获取日历时间的是 time, 其他的函数多是实现转换以及自定义日历表示的格式。

  1. clock_t clock(void); // 返回自执行以来程序所使用的 cpu 时间, clock()/CLOCKS_PER_SEC 是对应的秒数 ; -1 表明出错
  2. time_t time(time_t* tp); // 返回日历时间的算术表示, tp 不为 NULL 则也赋值 *tp ; -1 表明出错
  3. double difftime(time_t t2, time_t t1); // 返回 t2 - t1 的秒钟数
  4. struct tm *localtime(const time_t *tp); // 将日历时间 tp 转换为本地(考虑时区)的 struct tm 表示;
  5. struct tm *gmtime(const time_t *tp); // 将日历时间 tp 抓换为 UTC 的 struct tm 表示;
  6. char *asctime(const struct tm *tp); // 将 struct tm 转换为字符串表示;
  7. char *ctime(const time_t *tp); // 将 tp 转化为本地日历时间,返回字符串表示, 相当于 asctime(localtime(tp)) ;
  8. size_t strftime(char *s, size_t smax, const char *fmt, const struct tm*tp); // 自定义日历表示格式;
  9. time_t mktime(struct tm *tp); // 将日历格式 tp 转换为 time_t ;

程序实例

下面是一个程序实例, 供学习和参考使用:

  1. #include <stdio.h>
  2. #include <time.h>
  3.  
  4. int main(int argc, char* argv[])
  5. {
  6.     time_t tp;
  7.     struct tm *tb;
  8.     int year, month, day, hour, minute, second, weekday;
  9.     char fmt_calendar[100];
  10.    
  11.     tp = time(NULL);    // 获取一个时间点
  12.    
  13.     printf("UTC time : %s", asctime(gmtime(&tp)));    // 转换为 utc 的 struct tm , 再转换为字符串表示
  14.     printf("local time : %s", asctime(localtime(&tp)));    // 转换为本地(考虑时区)的 struct tm , 再转换为字符串表示
  15.     printf("local time : %s", ctime(&tp));    // ctime(&tp) 是 asctime(localtime(&tp)) 的简写
  16.    
  17.     tb = localtime(&tp);
  18.     printf("struct tm : %d 年 %d 月 %d 日 %d 时 %d 分 %d 秒 周 %d\n", 1900+tb->tm_year, 1+tb->tm_mon, tb->tm_mday, tb->tm_hour, tb->tm_min, tb->tm_sec, tb->tm_wday);
  19.    
  20.     tp = time(NULL);
  21.     tb = localtime(&tp);
  22.     strftime(fmt_calendar, 100, "%Y-%m-%d %H:%M:%S weekday: %w\n", tb);    // 自定义日期表示格式
  23.     printf("fmt calendar : %s", fmt_calendar);    // 输出格式化的日期
  24.    
  25.     return 0;
  26. }