Linux C语言编程-Linux系统环境--Linux上时间的相关操作---知识点总结

*********************注意:为了保证文章的完整性和全面性,作者会不定期对文章进行更新和修正*********************


1.和计算机相关的时间以及其相关概念

(1)UTC(Universal Time Coordinated,世界协调时间)

概念:UTC又被称为世界标准时间或是世界统一时间,在英文上称为CUT,法文上称为TUC,最后妥协为UTC,这个时间的计算相当复杂,这个时间是通过平均太阳时间(以格林尼治时间GTM为基准)和地轴修正后的新时标以及国际原子时间(以【秒】为单位)综合计算而成,这个时间的误差都必须保证在0.9s之内,使得UTC时间和地球自转一周的时间保持一致,这就是为什么这个时间被称作世界标准时间


(2)GMT(Greenwich Mean Time,格林尼治时间)

概念:十七世纪,格林威治皇家天文台为了海上霸权的扩张计画而进行天体观测。1675年旧皇家观测所(Old Royal Observatory) 正式成立,到了1884年决定以通过格林威治的子午线作为划分地球东西两半球的经度零度。观测所门口墙上有一个标志24小时的时钟,显示当下的时间,对全球而言,这里所设定的时间是世界时间参考点,全球都以格林威治的时间作为标准来设定时间,这就是我们耳熟能详的[格林威治标准时间]的由来,这个时间有好几个版本,最常用的还是UTC,所以在某种程度上UTC和GMT时间是相等的。

        在我们Linux系统中,有一个计时起点,这个时间便是:格林尼治时间的1970年1月1日 00:00,Linux以这个时间为计时起点,Linux上的时间就是以这个时间加上计数过的秒数来得到之后的时间的,所以在Linux中,这个计时起点又称之为"Linux的纪元时间",同理Unix也是一样的


2.计算机的时间计数起点为什么是1970年01月01日0点?

Unix系统的诞生时间是1969年,而当时只有32位的计算机,所以当时的时间也是以32位计数的,32位计数时间导致时间的最大的长度是68年,也许是因为Unix系统的诞生,需要时间的计数而且又考虑到32位计数时间在68年就会导致时间重置,而且在68年之内64位的操作系统就会出现来解决这个问题,在这三个因素的综合考虑之下选择了1970年01月01日0点,而且Unix的时间系统也是1970年诞生的,既然Unix已经选择了纪元时间,那么类Unix系统Linux也就参考了这个纪元时间点


3.Linux操作时间的一些函数以及实例代码

(1)time()函数<常用>

函数原型:
        #include <time.h>
        time_t time(time_t* tloc)
返回值:如果tloc为空,将返回返回time_t类型的数据,tloc不为空,将数据保存到tloc
相关介绍:
(1)首先介绍time_t这回类型,time_t其实是long类型的数据,只是使用了typedef关键字进行了重命名:
        #ifndef _TIME_T
        #define _TIME_T
                typedef long time
        #endif
        这个变量的作用是用来保存秒数的
(2)time()函数的作用是,将当前系统的时间到Linux纪元时间(1970年01月01日0点)的时间差的秒数保存到time中,当tloc这个参数为NULL时,time()函数,就返回一个time结果,这个结果保了当前系统时间到当纪元时间的时间差,如果tloc不为NULL,那么time()函数就会将当前系统时间和纪元时间的秒数差保存到tloc中
实例代码:

#include <time.h>		|	#include <time.h>
time_t tloc;			|	time_t tloc;
time(&tloc);			|	tloc = time(NULL);

(2)localtime()函数<常用>
ps:这个函数放在这里有一点早,但是这个函数经常和time()函数一起连用
函数原型:
        #include <time.h>
        struct tm* localtime(const time_t* timeval)
返回值:tm类型的数据
相关介绍:
(1)struct tm结构体
这个结构体也是用来保存时间的结构体,这个结构体保存的时间的相关的信息非常细致
struct tm
{
        int tm_sec;         //保存秒的成员,0~61
        int tm_min;         //保存分的成员,0~59
        int tm_hour;       //保存小时的成员,0~23
        int tm_mday;     //保存月份中的日期的成员,1~31
        int tm_mon;       //保存月份的成员,0~11
        int tm_year;         //保存当前年份到1900年的年的年份差
        int tm_wday;      //一周中的星期几,0~6(周日为0)
        int tm_yday;       //年份中的日期,0~365
        int tm_isdst;      //是否是夏令时
}
(2)localtime()函数的作用,就是将1970年01月01日0点到当前时间的秒数差,变为当地时间,其实就是将这个秒数差转化为tm类型的变量

实例代码:

	#include <time.h>
	#include <string.h>
	
	time_t myTime;	//定义time_t变量,来保存纪元时间到当前时间的秒数差
	struct tm* LT;	//定义tm结构体指针,来保存localtime()函数解析之后的时间
	char a[100];
	
	memset(a, 0x00, sizeof(a));	//将a字符串数组初始化一次
	time(&myTime);	//使用time()函数来得到秒数差,将这个秒数差保存到myTime中
	LT = localtime(&myTime);	//将time_t变量转变为tm类型的结构体
	//使用sprintf()函数将时间组合为string保存到a字符串数组中,而且注意tm_year保存的是1900到当前时间的年数差,所以你要得到当前的年份要将1900 + tm_year才行
	//还有tm_mon的范围为0~11(起点月为0),所以你要得到当前时间的月份要tm_mon + 1才行
	sprintf(a, "%d%02d%02d%02d%02d%02d", LT->tm_year + 1900, LT->tm_mon + 1, LT->tm_mday, LT->tm_hour, LT->tm_min, LT->tm_sec);

(3)difftime()函数
函数原型:
        #include <time.h>
        double difftime(time_t time1, time_t time2);
返回值:double类型的数据,这个数据保存的是时间差
相关介绍:
        这个函数的作用是计算time1和time2的时间差的函数(就是time1 - time2),最后将计算出来的结果以double的形式返回出来,其实我直接使用time1 - time2也是可以得到结果的
实例代码:


(4)gmtime()函数
函数原型:
     #include <time.h>
    struct tm* gmtime(const time_t *timeval);

返回值:tm类型的数据
相关介绍:
        这个函数和localtime()函数的作用相同,同样是将time_t变量变为tm,但是gmtime()函数在转换时间的时候使用的时区的时间为0,而localtime()是将纪元时间差转变为本地时间,所以localtime()这个在转变时使用的时区时间是你所在地的时区时间

实例代码:

#include <time.h>
//其他头文件不予以列出
	
time_t myTime;	//定义time_t变量,来保存纪元时间到当前时间的秒数差
struct tm* LT;	//定义tm结构体指针,来保存localtime()函数解析之后的时间
char a[100];
	
memset(a, 0x00, sizeof(a));	//将a字符串数组初始化一次
time(&myTime);	//使用time()函数来得到秒数差,将这个秒数差保存到myTime中
LT = gmtime(&myTime);	//将time_t变量转变为tm类型的结构体
//使用sprintf()函数将时间组合为string保存到a字符串数组中,而且注意tm_year保存的是1900到当前时间的年数差,所以你要得到当前的年份要将1900 + tm_year才行
//还有tm_mon的范围为0~11(起点月为0),所以你要得到当前时间的月份要tm_mon + 1才行
sprintf(a, "%d%02d%02d%02d%02d%02d", LT->tm_year + 1900, LT->tm_mon + 1, LT->tm_mday, LT->tm_hour, LT->tm_min, LT->tm_sec);


(5)mktime()函数
函数原型:
        #include <time.h>
        time_t mktime(struct tm* timeptr);
返回值:函数成功将tm*类型的数据转化为time_t时返回time_t类型的数据,如果转化失败返回-1
相关介绍:
这个函数的作用就是将一个tm结构体类型的数据重新变回time_t类型的数据,就是将细化的时间重新变为纪元时间到当前时间的时间差

实例代码:

#include <time.h>
//其他头文件不予以列出
	
time_t TestTime;
time_t TestTime2;
struct tm* TestTm;
		
time(&TestTime);
TestTm = localtime(&TestTime);
TestTime2 = mktime(TestTm);


(6)asctime()函数
函数原型:
        #include <time.h>
        char* asctime(const struct tm* timeptr);
返回值:char*类型的数据,这个数据中保存了以某种格式组合的时间的相关描述
相关介绍:
        这个函数的作用就是将struct tm*结构体的数据,以(tm_wday tm_mon+1 tm_mday HH:mm:ss tm_year+1990 <tm_wday为一周中的星期几, tm_mon+1一年中的月份, tm_mday一个月中的几号, HH:mm:ss时分秒 tm_year+1990年份>)

实例代码:

#include <time.h>
//其他头文件不予以列出
	
time_t TestTime;					
struct tm* TestTm;
char* TimeResult;
	
time(&TestTime);
TestTm = localtime(&TestTime);
TimeResult = asctime(TestTm);		|		或者:asctime(localtime(TestTime))


(7)ctime()函数
函数原型:
        #include <time.h>
        char* ctime(const time_t* timeval)
返回值:和asctime()函数一样,返回char*类型的数据,这个数据中保存了以某种格式组合的时间的相关描述
相关介绍:
        和asctime()函数一样,这个函数的作用也是将struct tm*结构体的数据,以(tm_wday tm_mon+1 tm_mday HH:mm:ss tm_year+1990 <tm_wday为一周中的星期几, tm_mon+1一年中的月份, tm_mday一个月中的几号, HH:mm:ss时分秒 tm_year+1990年份>)

实例代码:

#include <time.h>
//其他头文件不予以列出
	
time_t TestTime;					
struct tm* TestTm;
char* TimeResult;
	
time(&TestTime);
TestTm = localtime(&TestTime);
TimeResult = ctime(TestTm);			|		或者:ctime(localtime(TestTime))


(8)strftime()函数
函数原型:
        #include <time.h>
        size_t strftime(char* s, size_t maxsize, const char* format, struct tm* timeptr)
返回值:size_t类型的数据(size_t其实就是用来保存整形类型的数据,根据平台的不同他的真实类型也不同,可能是unsigned int也可能是别的),这个size_t保存的数据就是strftime函数往s中装载的数据的长度的大小。
相关介绍:
首先这个函数的作用有一点和sprintf相似,这个函数的作用是将timeptr结构体中的数据以一定的格式组合成为一个字符串保存到s中
参数:
        1.s(char*类型的,这个是用户自定义的数组,用来保存组合好后的数据)
        2.maxsize(size_t类型的,这个数据用来指示要保存到s中的数据的最大的长度)
        3.format(要保存的数据的格式)
        4.timeptr(保存了时间信息的tm结构体)

格式控制符:
        1.%a(星期几英文的缩写),%A(星期几英文的全称) 2.%b(月份的英文的缩写),%B(月份英文的全称)
        3.%c(日期和时间) 4.%d(一个月中的第几号01~31) 5.%H(24小时制中的小时,00~23)
        6.%I(12小时制中的时间,01~12) 7.%j(一年中的第几天,001~366) 8.%m(一年中的第几月,01~12)
        9.%M(分钟,00~59) 10.%p(a.m.(上午)或p.m.(下午)) 11.%S(秒,00~61)
        12.%u(一周中的星期几,数字,1~7) 13.%U(一年中的第几周(以周日作为一周的第一天来计算),01~53)
        14.%V(一年中的第几周(以周一作为一周的第一天来计算),01~53)
        15.%w(星期几,0~6(周日为0))
        16.%x(本地格式的日期),%x(本地格式的时间),%y(年份减去1900),%Y(年份),%Z(时区),%%(%字符)
实例代码:

	#include <time.h>
	//其他头文件不以列出
	time_t t;
	struct tm* T;
	char TestTime[100];
	
	memset(TestTime, 0x00, sizeof(TestTime));
	time(&t);
	T = localtime(&t);
	strftime(TestTime, sizeof(TestTime), "%Y/%m/%d--%H:%M:%S", T);
	
	printf("%s\n", TestTime);

(9)strptime()函数
函数原型:
        #include <time.h>
        char* strptime(const char* buf, const char* format, struct tm* timeptr)
返回值:字符串buf中的转换的最后一个转换的字符的后面的一个字符
相关介绍:
        这个函数和sscanf()函数有点相似,这个函数的作用是将buf字符串中保存的时间,按照format格式将数据转化到timeptr这个tm结构体中
参数:

        1.buf(保存时间的字符串)

        2.format(保存时间格式的字符串)

        3.timeptr(保存转化后时间数据的tm结构体)

        时间控制格式字符和strftime()函数是一样的,如果出现了段错误就适当的调节一下格式的大小写,如将%H->%h这样的话可能可以将数据解析成功,使用%H可能会失败,%S也可能要使用要%s
实例代码:
无 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值