有道云笔记:https://note.youdao.com/ynoteshare1/index.html?id=a71be28974000520f480b5369a5236c3&type=note#/
目录
ctime/asctime/gmtime/localtime/mktime 函数
一、时间的概念
1.1、 GMT与UTC时间的区别
GMT时间是格林尼治时间,世界统一,但是现在基本不用
UTC时间,原子钟时间,非常精确,现在一般用这个
1.2、计算机中与时间有关的部件
(1)点时间和段时间。段时间=点时间-点时间
(2)定时器和实时时钟。定时器(timer)定的时间就是段时间,
实时时钟(RTC)就是和点时间有关的一个器件。
二、linux系统中的时间
2.1、话说jiffies
- 全局变量jiffies用来记录自系统启动以来产生的节拍的总数。
- 启动时,内核将该变量初始化为0,此后,每次时钟中断处理程序都会增加该变量的值。
- 一秒内时钟中断的次数等于Hz,所以jiffies一秒内增加的值也就是Hz。系统运行时间以秒为单位,等于jiffies/Hz。
- jiffies过1s则+1。记录的是1970年1月1日00:00距离现在的秒数,是一个段时间。(不是点时间)
2.2、linux系统如何记录时间
- 操作系统只在开机时读一次RTC,整个系统运行过程中RTC是无作用的。RTC的真正作用其实是在OS的2次开机之间进行时间的保存。
- 内核在开机启动的时候会读取RTC硬件获取一个时间作为初始基准时间,这个基准时间对应一个jiffies值。
- (这个基准时间换算成jiffies值的方法是:用这个时间减去1970-01-01 00:00:00 +0000(UTC),然后把这个时间段换算成jiffies数值),这个jiffies值作为我们开机时的基准jiffies值存在。
- 然后系统运行时每个时钟节拍的末尾都会给jiffies这个全局变量加1,因此操作系统就使用jiffies这个全局变量记录了下来当前的时间。
- 当我们需要当前时间点时,就用jiffies这个时间点去计算(计算方法就是先把这个jiffies值对应的时间段算出来,然后加上1970-01-01 00:00:00 +0000(UTC)即可得到这个时间点)
2.3、linux中时间相关的系统调用
-
常用的时间函数
time_t time(time_t *t); man 2 |
#include <time.h> man 3
char *asctime(const struct tm *tm); char *asctime_r(const struct tm *tm, char *buf);
char *ctime(const time_t *timep); char *ctime_r(const time_t *timep, char *buf);
struct tm *gmtime(const time_t *timep); struct tm *gmtime_r(const time_t *timep, struct tm *result);
struct tm *localtime(const time_t *timep); struct tm *localtime_r(const time_t *timep, struct tm *result);
time_t mktime(struct tm *tm); |
size_t strftime(char *s, size_t max, const char *format, const struct tm *tm); |
#include <sys/time.h> man 3
int gettimeofday(struct timeval *tv, struct timezone *tz);
int settimeofday(const struct timeval *tv, const struct timezone *tz); |
- 常用时间格式之间的转换
2.4常用时间API函数功能测试
(相关API,自己man,有的传参是地址,有的是buf,有的是time_t,具体看api定义 )
-
time函数
返回值:为1970-01-01 00:00:00 +0000 (UTC). 到今天的秒数
int main(void)
{
time_t tNOW=-1;
tNOW= time(NULL);//返回值的方式
//time(&tNOW);//指针做输出型参数的方式
if(tNOW<0)
{
perror("time");
return -1;
}
printf("time:%ld\n\n",tNOW);
return 0;
}
-
ctime/asctime/gmtime/localtime/mktime 函数
E:\Linux\3.AppNet\3.osinfo\3.1
int main(void)
{
time_t tNOW=-1;
struct tm tmNow;
tNOW= time(NULL);//返回值的方式
//time(&tNOW);//指针做输出型参数的方式
if(tNOW<0)
{
perror("time");
return -1;
}
/1./time函数测试
printf("1.time函数测试\n");
printf("time:%ld\n\n",tNOW);
//2.ctime函数测试:ctime可以从time_t出发得到一个字符串格式的当前时间。
printf("2.ctime函数测试\n");
printf("ctime:%s\n",ctime(&tNOW));
/*3.gtime函数测试:获取的时间中:年份是以1970为基准的差值,月份是0表示1月,小时数是以UTC时间的0时区为