学习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;
}