Linux应用编程和网络编程(4、时间API)

1、时间的概念

可查看相关博客了解
链接:http://www.cnblogs.com/qiuyi21/archive/2008/03/04/1089456.html

2、Linux系统中的时间

2.1、jiffies的引入
(1)jiffies是Linux内核中的一个全局变量,这个变量用来记录以内核的节拍时间为单位时间长度的一个数值。
(2)内核配置的时候定义了一个节拍时间,实际上Linux内核的调度系统工作时就是以这个节拍时间为时间片的
(3)jiffies变量开机时有一个基准值,然后内核美国一个节拍时间jiffies就会加1,然后到了系统的任意一个时间我们当前时间就被jiffies这个变量所标注
2.2、Linux系统如何记录时间
(1)内核在开机启动的时候会读取RTC硬件获取一个时间作为初始基准时间,这个基准时间对应一个jiffies值(这个基准时间换算成jiffies值的方法是:用这个时间减去1970-01-01 00:00:00:00 +0000)
(2)这个jiffies值作为我们开机时的基准jiffies值存在,然后系统运行时每个时钟节拍的末尾都会给jiffies这个全局变量+1,因此操作系统就使用这个全局变量记录了当前的时间。当我们需要当前时间点时,就用jiffies这个时间点去计算(计算方法就是先把这个jiffies值对应的时间段算出来,然后再加上上面那个数值即可)
2.3、Linux中时间相关的系统调用
(1)常用的时间相关的API和库函数有以下几个:time/ctime/localtime/gmtime/mktime/asctime/strftime/gettimeofday/settimeofday
(2)time系统调用返回当前时间以秒为单位的距离1970-01-01 00:00:00 +0000(UTC)过去的秒数。这个time内部就使用jiffies换算得到的秒数,其他函数基本都是围绕time来工作的
(3)gmtime和localtime会把time得到的秒数变成一个struct tm结构体表示的时间
区别是:gettime得到的是国际时间,而localtime得到的是本地时间
(4)如果从struct tm出发想得到字符串格式的时间,可以用asctime或者strftime都可以
总结:无论是那个系统调用,最终得到的事件本质上都是一个时间,只不过不同的函数返回时间的格式不同,精度不同

3、时间相关API使用实战1

3.1、time
(1)time能得到一个当前时间距离标准起点时间1970-01-01 00:00:00 +0000(UTC)的过去了多少秒

#include<stdio.h>
#include<time.h>

int main(void)
{
	time_t tNow = -1;	//返回值的形式传入
	//time(&tNow);		//指针作输出型参数
	tNow = time(NULL);
	if(tNow < 0)
	{
		perror("time");
		return -1;
	}
	else
	{
		printf("time: %ld.\n", tNow);
	}

	retunr 0;
}

3.2、ctime
(1)ctime可以从time_t出发得到一个容易观察的字符串格式的当前时间
(2)ctime简单方便,可以直接得到当前时间的字符串格式,缺点是打印时间格式是固定的,不能自行改变
格式为:Sun Oct 24 11:08:25 2021
总结:ctime函数的得到的时间考虑了计算机本地时间(计算机中的时区设置)

#include<stdio.h>
#include<time.h>

int main(void)
{
	time_t tNow = -1;	//返回值的形式传入
	//time(&tNow);		//指针作输出型参数
	tNow = time(NULL);
	if(tNow < 0)
	{
		perror("time");
		return -1;
	}
	else
	{
		printf("time: %ld.\n", tNow);
	}
	
	printf("ctime: %s.\n", ctime(&tNow));	//ctime的时间
	
	retunr 0;
}

3.3、gmtime
(1)gmtime获取的时间中:年份是以1970为基准的差值,月份0表示1月,小时数是以UTC时间的0时区为标准的小时数(北京市东8区,因为北京时间比这个时间大8)

#include<stdio.h>
#include<time.h>
#include<string.h>

int main(void)
{
	struct tm tmNow;
	
	time_t tNow = -1;	//返回值的形式传入
	//time(&tNow);		//指针作输出型参数
	
	tNow = time(NULL);
	if(tNow < 0)
	{
		perror("time");
		return -1;
	}
	else
	{
		printf("time: %ld.\n", tNow);
	}
	
	printf("ctime: %s.\n", ctime(&tNow));	//ctime的时间
	
	memset(&tmNow, 0, sizeof(tmNow));		//gmtime
	tmNow = gmtime(&tNow, &tmNow);
	printf("年%d月%d日%d.\n", tmNow.tm_year, tmNow.tm_mon, tmNow.tm_mday, tmNow.tm_hour);
	
	retunr 0;
}

3.4、localtime
(1)localtime和gmtime的唯一区别是getime以当前计算机中设置的时区为小时的时间基准,其余都一样

#include<stdio.h>
#include<time.h>
#include<string.h>

int main(void)
{
	struct tm tmNow;
	
	time_t tNow = -1;	//返回值的形式传入
	//time(&tNow);		//指针作输出型参数
	
	tNow = time(NULL);
	if(tNow < 0)
	{
		perror("time");
		return -1;
	}
	else
	{
		printf("time: %ld.\n", tNow);
	}
	
	printf("ctime: %s.\n", ctime(&tNow));	//ctime的时间
	
	memset(&tmNow, 0, sizeof(tmNow));		//localtime
	tmNow = localtime(&tNow, &tmNow);
	printf("年%d月%d日%d.\n", tmNow.tm_year, tmNow.tm_mon, tmNow.tm_mday, tmNow.tm_hour);
	
	retunr 0;
}

3.6、mktime
(1)一般我们读取时间是用不到mktime的,mktime主要是用来向操作系统设置时间用的
3.7、asctime
(1)asctime得到一个固定格式的字符串格式的当前时间,效果上和ctime一样,区别在于ctime从time_t出发,而asctime从struct tm出发
3.8、strftime
(1)asctime和ctime得到的时间字符串都是固定格式的,没法用户自定义格式
(2)如果需要用户自定义时间的格式,则需要用strftime
3.9、gettimeofday和settimeofday
(1)

#include<stdio.h>
#include<time.h>
#include<string.h>
#include<sys/time.h>

int main(void)
{
	char buf[100];
	struct timeval tv = {0};
	struct timezone tz = {0};
	int ret;
	
	ret = gettimeofday(&tv, &tz);
	if(ret < 0)
	{
		perror("gettimeofday");
		return -1;
	}
	printf("second: %d.\n", tv.tv_sec);
	printf("timezone: %d.\n", tz.tz_usec);
	retunr 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值