⑴ 【c/c++】linux时间获取与时间转换函数总结
在编程中,处理时间戳和模块耗时是常见的需求,本文将对相关时间函数及其应用场景进行梳理。
获取时间:clock, time, gettimeofday, C++11引入的chrono库函数
时间格式转换:ctime, localtime, gmtime, asctime, mktime,以及strftime
计算时间差:difftime
线程安全转换:ctime_r, localtime_r, asctime_r, gmtime_r
例如,通过chrono::system_clock::now()获取高精度时间点。
ctime可将时间戳转化为可读格式,如ctime(&time_buffer);strftime用于格式化输出,如strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", &time_val)。
通过difftime计算两个时间点的差值,如double diff = difftime(end_time, start_time)。
如ctime_r通过指定的buffer和r指向的存储区域,保证了线程间的独立性,如ctime_r(&time_buffer, &r)。
⑵ Linux时间的获取与使用
Linux系统中的时间包含两种形式,日历时间和进程时间。日历时间表示从1970年1月1日0点(UTC时间)以来的秒数累计值,通过time_t数据类型保存,最后转换得到我们熟悉的24小时或12小时制时间。而进程时间,即CPU时间,衡量进程使用中央处理器资源的量,以时钟滴答计算。
获取日历时间的函数time()返回时间戳,为从1970年1月1日0点到现在经历的秒数,如返回值1533287924。为了获得更高精度的时间,使用gettimeofday()和clock_gettime()函数。gettimeofday()函数用timeval结构体保存微秒精度的时间戳,clock_gettime()函数用timespec结构体保存纳秒精度的时间戳。
将时间戳转化为日/月/年的时间,使用tm结构体。通过gmtime()和localtime()函数将time_t类型的时间戳转换为tm结构体表示的日期时间。固定格式打印时间,可以使用ctime()和asctime()函数,但这两个函数已被标记为弃用。更安全的方法是采用strftime()函数,它支持自定义格式化输出日期和时间。
在业务程序中,对比时间的先后通常通过时间戳进行,mktime()函数用于将struct tm结构体转换为time_t的时间戳,便于比较和计算。但在转换时需要注意,使用localtime()函数得到的时间戳是从1900年1月1日开始计算的,可能需要调整以得到准确结果。
Linux系统中的进程时间表示进程使用CPU的时间,分为用户时间和内核时间两部分。clock()函数提供了一个简单的接口,返回值描述进程使用的总的CPU时间,计量单位为CLOCKS_PER_SEC。times()函数提供了更详细的进程时间表示,返回值的计量单位由sysconf(SC_CLK_TCK)确定。
通过以上描述,我们可以清楚地理解Linux系统中时间的获取与使用方法,以及不同函数之间的关系,为实际编程提供有力支持。