日历时间
日历时间就是从Epoch开始计时的时间,以自从Epoch以来的秒数来定义的。Epoch时间也就是格林威治时间(1900年1月1日零点,又称为UTC时间)。
在Linux系统中,存储时间秒数的都是time_t
系统类型。
获得日历时间
首先是包含在sys/time.h
中的
|
|
第一个参数是一个timeval
结构体:
|
|
用于存储时间。tc_sec
成员用于存储自Epoch的秒数,tv_usec
则指出在这个秒数上离现在时间还多出多少微秒。也就是说如果将时间全部换算乘秒数,那么有:
$$
nowtime = time_{1900-1-1\ 0:0:0} + tc_sec + tv_usec
$$
第二个参数是废弃的,总是应该是NULL
。
或者使用更加直接粗暴的函数time()
,这个函数也是个常用函数,用于返回从Epoch到现在的时间。
需要注意的是,time()
函数如果你给了一个参数time_t* timeep
,那么秒数会保存到timeep
中。如果你给NULL,那么会直接返回秒数(出错返回-1)。但是因为返回值更好用,所以我们一般都是直接将参数传为NULL
。
将time_t
转化为人话
因为time_t
是自从Epoch的秒数,所以阅读起来很费劲。我们可以通过下面这个函数让其通俗易懂一点:
|
|
time_t
和分解时间的转换
由于time_t
比较难表示具体的年月日,所以有了tm
结构体:
|
|
参数意思一目了然,不解释。
可以通过
|
|
分解时间和人话之间的转换
接下来是分解时间和打印时间的转换:
|
|
这里strftime()
函数其实就是日期打印版本的sprintf()
时区
Linux所有的时区都是放在文件中管理的,在/usr/share/zoneinfo
文件夹下。比如日本的Japan
文件和香港的Hongkong
文件
如果想要修改时区的话,需要修改环境变量TZ(你完全可以用setenv
等函数改变)。不敢过TZ
的改变是有格式的:使用冒号开头,后面是基路径为/usr/share/zoneinfo的时区文件路径,路径分隔符用冒号代替。比如/usr/share/zoneinfo/Asia/Hovd
(Hovd时区),那么你就要写:Asia:Hovd
。如果是不在文件夹里面的时区(比如Hongkong),那么直接:Hongkong
即可。
更新系统时钟
你可以通过下面两个函数更新系统时钟:
|
|
其中settimeofday
是大调整(一般不会用到),adjtime()
是小调整。
进程时间
进程时间是值进程创建之后使用的CPU数量。有如下函数获得:
|
|
一般使用clock()
函数居多,用于检测算法的运行时间。