通过C语言来认识时间

        学习C语言之前,我只知道有北京时间,世界时间,通过今天的学习让我认识到了竟然还有这么多的”时间“。

        这里的时间是计算机常用的时间,分别有:

        GMT(格林威治时间)也叫格林尼治。

        科普:格林尼治标准时间(旧译格林威治平均时间或格林威治标准时间;英语:GreenwichMeanTime,GMT)是指位于英国伦敦郊区的皇家格林尼治天文台的标准时间,因为本初子午线被定义在通过那里的经线

        理论上来说,格林尼治标准时间的正午是指当太阳横穿格林尼治子午线时(也就是在格林尼治时)的时间。由于地球在它的椭圆轨道里的运动速度不均匀,这个时刻可能和实际的太阳时相差16分钟。

        UTC(世界标准时间)

        协调世界时,又称世界统一时间、世界标准时间、国际协调时间。由于英文(CUT)和法文(TUC)的缩写不同,作为妥协,简称UTC。

        协调世界时是以原子时秒长为基础,在时刻上尽量接近于世界时的一种时间计量系统。由原子钟(见天文时计)导出的时间叫原子时,简称AT。

        EPOCH(纪元点)

        英文Epoch,时期; 纪元,在这里表示时间戳

        unix时间戳(Unix timestamp)

        UNIX时间戳Unix时间戳(英文为Unix time, POSIX time 或 Unix timestamp)是从Epoch(1970年1月1日00:00:00 UTC)开始所经过的秒数,不考虑闰秒

        一个小时表示为UNIX时间戳格式为:3600秒;一天表示为UNIX时间戳为86400秒,闰秒不计算。

        在大多数的UNIX系统中UNIX时间戳存储为32位,这样会引发2038年问题或Y2038。

时间

1 分钟

60 秒

1 小时

3600 秒

1 天

86400 秒

1 周

604800 秒

1 月 (30.44 天)

2629743 秒

1 年 (365.24 天)

31556926 秒

        C语言如何表示时间

        CLOCK TICK(时钟计时单元)

        简单而言,就是该程序从启动到函数调用占用CPU的时间。这个函数返回从“开启这个程序进程”到“程序中调用clock()函数”时之间的CPU时钟计时单元(clock tick)数,在MSDN中称之为挂钟时间(wal-clock);若挂钟时间不可取,则返回-1。其中clock_t是用来保存时间的数据类型。

        C库提供了各种库来表示时间的获取:

#include <utime.h>
#include <time.h> 
#include <stdlib.h>
#include <sys/times.h>  

        获取时间戳

        关于时间戳:计算机和众多编程语言获取的时间都是从Epoch(1970年1月1日00:00:00 UTC)开始所经过的秒数.

	time_t t1;
	time_t ret;
	ret=time(&t1);
	//time()函数;
	/*1.返回值是时间戳
	  2.实参是地址,地址里面的内容也是时间戳 
	*/ 
	printf("时间戳:%lld\n",ret); 
	
	struct timespec ts;
	//CLOCK_REALTIME:相对时间 ,从1970.1.1到目前的时间 
	clock_gettime(CLOCK_REALTIME,&ts);
	long long ms=ts.tv_sec*1000+ts.tv_nsec/1000000;//timespec获取毫秒
	printf("ms=%lld\n",ms);
	
	struct timeval tv;//timeval获取微妙
	mingw_gettimeofday(&tv,NULL);
	printf("tv=%lld\n", tv.tv_sec * 1000 * 1000 + tv.tv_usec);

        可以通过time_t t1获取当前时间戳,通过timespec获取毫秒,timeval获取微妙

        时间的单位换算  :

        1秒=1000毫秒(ms)

        1毫秒=1/1,000秒(s)

        1秒=1,000,000 微秒(μs)

        1微秒=1/1,000,000秒(s)

        1秒=1,000,000,000 纳秒(ns)

        1纳秒=1/1,000,000,000秒(s)

        1秒=1,000,000,000,000 皮秒(ps)

        1皮秒=1/1,000,000,000,000秒(s)

        获取日历时间

        用localtime获取,localtime返回的内容和本地时区有关系,是根据时区返回的值

	time_t t;
	time(&t);//t保存时间戳
	struct tm *timeData;	
//	printf("时间戳:%lld\n",t);
	
	timeData=localtime(&t);
	
	printf("tm_sec=%d\n",timeData->tm_sec);
	printf("tm_min=%d\n",timeData->tm_min);
	printf("tm_hour=%d\n",timeData->tm_hour);
	printf("tm_mday=%d\n",timeData->tm_mday);
	printf("tm_mon=%d\n",timeData->tm_mon+1);
	printf("tm_year=%d\n",timeData->tm_year+1900);
	printf("tm_wday=%d\n",timeData->tm_wday);
	printf("tm_yday=%d\n",timeData->tm_yday);
	printf("tm_isdst=%d\n",timeData->tm_isdst);
	
	//日历时间转换为时间戳
	time_t t2=mktime(timeData);
	printf("时间戳:%lld\n",t);
	printf("\n");
	
	
	//修改日历时间,先记录时间戳,再转换为日历时间 
	timeData->tm_min=100;
	t2=mktime(timeData);
	timeData=localtime(&t2);
	printf("tm_sec=%d\n",timeData->tm_sec);
	printf("tm_min=%d\n",timeData->tm_min);
	printf("tm_hour=%d\n",timeData->tm_hour);
	printf("tm_mday=%d\n",timeData->tm_mday);
	printf("tm_mon=%d\n",timeData->tm_mon+1);
	printf("tm_year=%d\n",timeData->tm_year+1900);
	printf("tm_wday=%d\n",timeData->tm_wday);
	printf("tm_yday=%d\n",timeData->tm_yday);
	printf("tm_isdst=%d\n",timeData->tm_isdst);
	
	struct tm *gmData=gmtime(&t2);//转换为格林威治时间 
	printf("%d:%d:%d\n",gmData->tm_hour,gmData->tm_min,gmData->tm_sec); 

      格式化时间(自定义时间)

        根据需求定义不同的排列方式


	//1.定义时间戳普通变量 
	time_t t_abc;
	//2.通过time()函数,获取时间戳 
	time(&t_abc);
	//3.定义日历指针变量 
	struct tm *tdata;
	//4.通过localtime()函数,将时间戳转换为日历 
	tdata=localtime(&t_abc);
	//5通过asctime()函数,将日历信息打印出来
	puts(asctime(tdata)); 
	//或者通过ctime()函数,直接将时间戳以格式日期的形式输出
	puts(ctime(&t_abc));
	
	//按照格式定义,自主选择格式化输出日期
	char str_time[50];
	
	size_t ret=strftime(str_time,50,"%Y-%m-%d %a %p %Z %H:%M:%S %j",tdata);	
	printf("ret=%d\n",ret);//返回值为字符串长度 
	printf("strftime()转换后:%s\n",str_time);

        下面这个是通过asctime或ctime函数打印的时间

         这个是自定义的:

        计算时间差

        方法是获取两个时间戳,后面的减去前面的即可。

    unsigned int i;
	time_t t_start;
	time_t t_end;
	t_start=time(NULL);
	printf("t_start=%lld\n",t_start);
	for(i=0;i<0xFFFFFFFF;i++)
	{
		;
	}
	t_end=time(NULL);
	printf("t_end=%lld\n",t_end);
	unsigned int ret=t_end-t_start;//结束时间-开始时间 
	printf("ret=%d\n",ret);	

        代码练习:

/*
编写一个函数,返回当前时间的秒数,毫秒数,微秒数,纳秒数
*/
// #include <sys/times.h>
#include <stdio.h>
#include <time.h>
#include <utime.h>
#include <stdlib.h>
 //64位 
 int main()
 {
 	time_t t1;
 	time_t ret;
 	ret=time(&t1);
 	printf("s=%lld\n",ret);

 	struct timespec s1;
 	
 	clock_gettime(CLOCK_REALTIME,&s1);
 	long long ms=s1.tv_sec*1000+s1.tv_nsec/1000000;
 	printf("ms=%lld\n",ms);
 	//struct timeval s2; 
 	long long us=s1.tv_sec*1000*1000+s1.tv_nsec/1000;
 	printf("us=%lld\n",us);
 	
 	long long as=s1.tv_sec*1000*1000*1000+s1.tv_nsec;
 	printf("as=%lld\n",as);
 	
 	return 0;
 }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值