time.h

time.h 头文件提供了与时间日期相关的类型, 函数, 结构体.

类型

time_t

time_t 是适合存储时间的类型, 一般为 unsigned int. 是 time() 的返回值的类型.

time.h 中声明的许多函数都会接受一个名为 timer 的 time_t 类型参数.

clock_t

适合于存储处理器计时的类型. 一般为 long int.

struct tm

一个存储时间日期信息的结构体. 由 localtime() 返回. 具有以下成员:

int tm_year

年. 注意, 是从 1900 年开始计算的. 例如, 若得到的值为 119, 则实际上表示 2019 年.

int tm_mon

月. 范围 0~11. 是从 0 开始计算的. 需要注意.

int tm_mday

在某月的第几日. 范围 1~31. 除了这个成员, 其他都是从 0 开始计算.

int tm_wday

在某一周的第几日. 范围 0~6.

int tm_yday

在某一年的第几日. 范围 0~365.

int tm_hour

二十四小时制. 0~23.

int tm_min

分钟. 0~59.

int tm_sec

秒. 0~59.

int tm_isdst

是否为夏令时. 返回 1 或 0.

下面两个成员在定义了 __USE_MISC 后才会被定义.

char* tm_zone

显示当前时区.

long int tm_gmtoff

与 UTC (太平洋标准时间) 相差的秒数. 东为正, 西为负.

long int CLOCKS_PER_SEC

当前处理器每秒对应的时钟个数.

函数

clock_t clock(void)

返回从程序开始运行到此时的 CPU 时钟数. 进程挂起的时间不计算在内.

算式 返回值 / CLOCKS_PER_SEC 将数值单位转化为秒.

time_t time(time_t* timer)

返回当前系统时间. (Unix 时间戳). 如果指针 timer 不是 NULL, 则会将返回值存储在 timer 中.

参数:
  • timer (time_t*) – time_t 的指针.
double difftime(time_t time1, time_t time0)

返回 time1 - time0 的值. 单位为秒.

struct tm* gmtime(time_t *timer)

将 timer 解析为 tm 结构体, 使用 UTC 时区(格林威治时间)

struct tm* localtime(time_t *timer)

将 timer 解析为 tm 结构体, 使用 本地 时区

time_t mktime(struct tm *tp)

将 tm 结构体解析为依据本地时区的 time_t 时间戳.

size_t strftime(char *str, size_t maxsize, char *fmt, struct tm *tp)

根据 fmt 将 tm 结构体转化为字符串.

格式字符串支持的转义符号:

符号 含义 举例
%Y 2019
%m 月 (01-12) 03
%d 日 (01-31) 07
%H 时 (00-23) 00
%M 分 (00-59) 07
%S 秒 (00-59) 55
%A 星期名称 Thursday
%a 星期缩写 Thu
%B 月份名称 March
%c 完整的日期时间表示  
%I 12 小时制小时 (01-12) 12
%j 一年的第几天 (01-366)  
%p AM 或 PM AM
%U 一年的第几周 (00-53) 以第一个星期日开始  
%w 一周的星期几 (0-6) 4
%W 一年的第几周 (00-53) 以第一个星期一开始  
%x 日期 07/03/19
%X 时间 00:18:22
%y 年份, 后两位. 19
%Z 时区.  
参数:
  • str (char *) – 将生成的字符串存入目标字符数组.
  • maxsize (size_t) – 最大可写入的字符数, 一般传入字符数组的长度.
  • fmt (char *) – 格式字符串.
  • tp (struct tm *) – 存储日期时间信息的 tm 结构体.
返回:

如果写入的字符数(包括结束符)小于 maxsize, 则返回去除结束符的写入字符数. 否则返回 0.

返回类型:

size_t

示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <stdio.h>
#include <time.h>

#ifdef _WIN32
#include <Windows.h>
#define sleep(ms) Sleep((ms) * 1000)
/**
 * 挂起操作和操作系统有关,
 * 而且 GCC 与 MSVC 分别使用秒和毫秒
 */
#else
#include <unistd.h>
#endif /* _WIN32 */

void show_struct_tm(void)
{
    time_t timer;
    struct tm* date;
    time(&timer);
    date = localtime(&timer);
    printf("year is %d\n", date->tm_year);
    printf("mon is %d\n", date->tm_mon);
    printf("mday is %d\n", date->tm_mday);
    printf("wday is %d\n", date->tm_wday);
    printf("yday is %d\n", date->tm_yday);
    printf("hour is %d\n", date->tm_hour);
    printf("min is %d\n", date->tm_min);
    printf("sec is %d\n", date->tm_sec);
    printf("isdst is %d\n", date->tm_isdst);
    // GLIBC 才包含以下两个成员, 非 C 标准.
    // printf("zone is %s\n", date->tm_zone);
    // printf("gmtoff is %ld\n", date->tm_gmtoff);
    printf("::::%s\n\n", __func__);
}

void show_clock_per_sec(void)
{
    clock_t clocker;
    clocker = clock();
    printf("clock: %ld\n", clocker);
    printf("CLOCKS_PER_SEC = %ld\n", CLOCKS_PER_SEC);
    printf("::::%s\n\n", __func__);
}

void show_difftime(void)
{
    time_t a, b;
    time(&a);
    sleep(3);
    time(&b);
    printf("TIME1 - TIME2 = %lf\n", difftime(b, a));
    printf("::::%s\n\n", __func__);
}

void show_strtime(void)
{
    time_t timer;
    struct tm *tp;
    char buffer[255] = {'\0'};
    time(&timer);
    tp = localtime(&timer);

    strftime(buffer, 255, "%Y-%m-%d %H:%M:%S", tp);
    printf("%s:::: %s\n", "%Y-%m-%d %H:%M:%S", buffer);
    strftime(buffer, 255, "%c", tp);
    printf("%s:::: %s\n", "%c", buffer);
    strftime(buffer, 255, "%x, %X", tp);
    printf("%s:::: %s\n", "%x, %X", buffer);
    strftime(buffer, 255, "%y", tp);
    printf("%s:::: %s\n", "%y", buffer);
    strftime(buffer, 255, "%I %p", tp);
    printf("%s:::: %s\n", "%I %p", buffer);
    strftime(buffer, 255, "%A, %a, %B", tp);
    printf("%s:::: %s\n", "%A, %a, %B", buffer);
    strftime(buffer, 255, "%Z", tp);
    printf("%s:::: %s\n", "%Z", buffer);

    printf("::::%s\n\n", __func__);
}

int main(int argc, char* argv[])
{
    show_struct_tm();
    show_clock_per_sec();
    show_difftime();
    show_strtime();
    return 0;
}