时间及其转换

1. 日历时间(Calendar Time)

unix系统内部对时间的表示方式均是以自Epoch以来的秒数来度量的。Epoch即通用协调时间(UTC, 也称为格林威治标准时间,或GMT)的1970年1月1日早晨零点。

日历时间存储在类型为 time_t 的变量中。

1.1 gettimeofday()

可与tv指向的缓冲区中返回日历时间

int gettimeofday(struct timeval * tv, struct timezone *tz)

其中tv定义如下:

struct timeval {

​ time_t tv_sec; // UTC 以来的秒数

​ suseconds_t tv_usec; // 微妙

}

tz为历史产物,目前已经被废弃,应始终设置为NULL。

1.2 time()

time() 返回Epoch以来的秒数,和gettimeofday()所返回的tv参数中的tv_sec字段的数值相同。

1.3 时间转换函数

time_t 可通过以下转换函数实现不同格式间的转换

1.3.1 ctime()

char* ctime(const time_t *timep) 将返回一个长达26字节的字符串 (包含\n \0 结束符),内含标准格式的日期和时间。如下所示:
Tue Nov 17 12:22:34 CST 2020
ctime函数自动的对本地时区和DST(Daylight Saving Time, 即夏令时)的设置加以考虑,返回的字符串是静态分配,下一次调用将会覆盖上一次的值。(可使用ctime_r版本替换ctime,解决静态分配问题)

1.3.2 gmtime() 和localtime() 将time_t转为分解时间

函数gmtime()和localtime()可将time_t 的值转换为分解时间,分解时间被置于静态结构中,其地址作为函数结果返回

1
2
struct tm * gmtime(const time_t *timep)
struct tm * localtime(const time_t * timep)

gmtime 可以将日历时间转换为UTC的分解时间,(GM来自于格林威治标准时间)
localtime 将考虑时区和夏令时设置,返回对应于系统本地时间的一个分解时间

1
gmtime_r 和localtime_r 为两个函数的可重入版本

1.3.3 mktime() 将本地分解时间转为time_t

这一转换会忽略输入tm结构中的tm_wday和tm_yday字段。

1.4 分解时间和打印格式之间的转换

1.4.1 asctime()

char* asctime(const struct tm* timeptr) 功能等同于ctime(), 只不过接收的参数是struct tm*类型;本地时区的设置对本函数没有影响
可重入版本为asctime_r()

1.4.2 strftime() 更精确的打印格式转换

size_t strftime(char * outstr, size_t maxsize, const char * format, cosnt struct tm* timeptr); 在分解时间转换为打印格式时,可通过format 提供更为精确的控制。令timeptr指向分解时间,strftime()会将以null结尾,由日期和时间组成的响应字符串置于outstr所指向的缓冲区中

strptime() 将打印格时间 转换为分解时间

函数strptime() 是strftime()的逆向函数,将字符串转为分解时间
char * strptime(cosnt char * str, const char * format, struct tm * timeptr)

2. 进程时间

也成为cpu时间,以时钟滴答进行计算

times()

clock_t times(struct tms * buf) 获取程序执行消耗的用户时间和cpu时间,tms结构体的前两个字返回调用进程到目前为止使用的用户和系统组件的cpu时间,最后两个字段返回的信息是:父进程(比如,times()的调用者)执行了系统调用wait()的所有已经终止的子进程使用的cpu时间。
clock_t 是用时钟计时单元为单位度量时间的整型值。我们可以调用sysconf(_SC_CLK_TCK)来获取每秒包含的时钟计时单元数,然后用这个数字除以clock_t 转换为秒

注意:clock_t 是有有效范围的,溢出后,times(0的返回值将再次从0开始计算)

clock()

函数clock_t clock(void); 提供了一个简单的接口用于取得进程时间。它返回一个值描述了调用进程使用的总的CPU时间(包括用户和系统).


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!