一、预备知识:
24时区,GMT,UTC,DST,CST时间详解:
二、时间相关的函数汇总:
1.获取时间的的函数:time、gettimeofday、clock_gettime
2.时间转换的函数:asctime, ctime, gmtime, localtime, mktime, asctime_r, ctime_r, gmtime_r, localtime_r
3.时间设置函数:settimeofday
4.计算程序运行时间相关函数:clock、times、clock_gettime(实时函数,也可以用做获取当前时间)
三、时间获取函数的精度分析:
time()函数的精确度是1s
clock()函数的精确度是10毫秒(ms)
times()函数的精确度是10毫秒(ms)
gettimofday()函数的精确度是微秒(μs)
clock_gettime()函数的计量单位为十亿分之一,也就是纳秒(ns)
四、时间转换函数分析
1.asctime, ctime, gmtime, localtime与
asctime_r, ctime_r, gmtime_r, localtime_r 区别在于有_r的函数是线程安全的函数,而没有_r的函数是线程不全的的。在多线程编程的时候要注意。
gmtime和时区无关,总是获取是GMT0(和UTC0相同)的时间,同时夏日节约时间DST的时间偏移也为0.而localtime获取的时间包含了时区偏移。具体分析见附录1.
2.ctime相当于localtime与asctime的组合。
3.mktime将参数timeptr所指的tm结构数据转换成从公元1970年1月1日0时0分0 秒算起至今的UTC时间所经过的秒数,相当于time()的逆操作。
下一节主要介绍如何利用setenv、putenv来使得不同的进程获取不同的时区时间。
参考资料:
附录1:
gmtime和localtime的在glibc中的区别
在glibc2.18中,localtime和gmtime都是调用__tz_convert和__offtime 实现的。
struct tm *__tz_convert (const time_t *timer, int use_localtime, struct tm *tp);
其中use_localtime就是用来是标志是否和本地时区相关联。
下面是gmtime和localtime的定义:
struct tm *gmtime (t)
const time_t *t;
{
return __tz_convert (t, 0, &_tmbuf);
}
struct tm *
localtime (t)
const time_t *t;
{
return __tz_convert (t, 1, &_tmbuf);
}
参考资料:glibc-2.18源码
说明:对于函数gmtime和localtime在glibc-2.18和glibc-1.09实现有点不同。
阅读(589) | 评论(0) | 转发(0) |