在 Linux 中,存在 4 种时间类型,本篇以这 4 种类型为例,总结一下使用 C 语言的获取、计算方法。
同时,存在以下 3 种计算机系统中常见的关于时间的定义:
UTC:协调世界时,又称世界标准时间(Universal Time Coordinated)。是最主要的世界时间标准,其以原子时的秒长为基础,在时刻上尽量接近于格林威治标准时间。现行的协调世界时根据国际电信联盟的建议《Standard-frequency and time-signal emissions》(ITU-R TF.460-6)所确定。UTC基于国际原子时,并通过不规则的加入闰秒来抵消地球自转变慢的影响。闰秒在必要的时候会被插入到UTC中,以保证协调世界时(UTC)与世界时(UT1)相差不超过0.9秒。
GMT:格林尼治标准时间(旧译格林威治平均时间或格林威治标准时间;英语:Greenwich Mean Time)是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线。
CST:中国标准时间(China Standard Time),北京时间为 UTC+8,即东八区时间。
类型
clock_t
原型:
1 |
|
介绍:
clock_t
是一个以 微秒 为单位的整型数,用以计数 CPU 运行时间。
time_t
原型:
1 |
|
介绍:
time_t
是一个以 秒 为单位的整型数,用以表示自 格林威治时间1970年01月01日00时00分00秒 起至现在的总秒数。
timeval
原型:
1 |
|
介绍:
timeval
是一个包含 毫秒 的 格林威治时间。
tm
原型:
1 |
|
介绍:
tm
:是一个直接存储年月日的结构。
broken-down time
:分解时间。
操作
函数原型及说明
睡眠
1 |
|
操作函数
1 |
|
clock_t
1 |
|
输出:
1 | Clocks pre sec: 1000000 |
备注:
这个时间差是程序运行的时间差,和真实时间有出入,当 sleep(1) 时,可能程序时间差只有几百微秒。
time_t
1 |
|
输出:
1 | 1693842496 1693842498 |
备注:
gmtime 为 GMT 时间;
localtime、ctime 为调整时区后的 UTC+8 时间。
timeval
1 |
|
输出:
1 | T1: 1693844329 432130 |
备注:
sleep 的浮点参数会隐式转换为整型,小数部分不起作用。
Linux 中的延时函数,精度低于 2ms。
tm
1 |
|
输出:
1 | gmtime: 2023-9-6 13:52:14 Wed 248 0 |
备注:
两个 struct tm 要比较大小,要先用 mktime 都转为 time_t 之后,再使用 difftime 比较。
时区操作
date 查看时间
1 | date -R |
根据 RFC 2822 format 所示,上面命令输出的 +0800 表示东八区。
设置系统时区
1 | $ tzselect |
使用 tzselect 命令选择时区,选择完成后会输出时区的写法,然后在.profile、.bash_profile 或者 /etc/profile 中设置正确的 TZ 环境变量并导出,重新登陆方可生效。
1 | You can make this change permanent for yourself by appending the line |