进击吧,linux(十) 时间编程
0赞利用linux提供的时间相关的函数,可以获取时间。
时间类型是有两种:
1、UTC,也就是世界标准时间。也称为格林威治标准时间。
2、Calendar time,日历时间,从一个时间点(1970年1月1日0点0分0秒)到目前的时间所经历的秒数。
内核提供一个time函数,可以得到日历时间。然后通过gmtime函数或者localtime函数,得到tm的时间格式。tm中包括了我们所用的时间,年月日等等。然后再通过asctime函数,可以将tm的时间格式给转化成字符串,方便我们查看。
下面就是各个函数的学习。同样,还是使用学习模板来学习。
1.1.1函数名
time
1.1.2函数原形
time(time_t *t)
1.1.3函数功能
获取日历时间
1.1.4所属头文件
1.1.5返回值
成功:返回日历时间(从1970年1月1日0时到现在的时间,以秒为单位)
失败:-1
1.1.6参数说明
t:如果t不为空,保存返回值。也可以为空。
1.1.7示例代码
程序的结果就是日历时间,以秒为单位的。这个时间就很不直观了。需要自己对这个数据转化。
1.2.1函数名
gmtime
1.2.2函数原形
struct tm *gmtime(const time_t *timep)
1.2.3函数功能
将日历时间转化成UTC(世界标准时间)
1.2.4所属头文件
1.2.5返回值
成功:世界标准时间,以tm结构体存储
失败:NULL
1.2.6参数说明
timep:待转化的日历时间
1.2.7示例代码
这样,时间就有可读性了,不过这时间是世界标准时间,不是本地的时间。注意年是从1900年算起的,所以年需要加上1900才是现在的年。月是从0开始的,所以需要加1。
1.3.1函数名
localtime
1.3.2函数原形
struct tm *localtime(const time_t *timep)
1.3.3函数功能
将日历时间转化为本地时间
1.3.4所属头文件
1.3.5返回值
成功:本地时间,以tm结构体存储
失败:NULL
1.3.6参数说明
timep:待转化的日历时间
1.3.7示例代码
这样,就得到了本地的时间了。
1.4.1函数名
asctime
1.4.2函数原形
char *asctime(const struct tm *tm)
1.4.3函数功能
将struct tm格式的时间转化成字符串
1.4.4所属头文件
1.4.5返回值
成功:字符串的首地址
失败:NULL
1.4.6参数说明
tm:待转化的tm格式时间
1.4.7示例代码
运行结果,时间显示就更有可读性了。
1.5.1函数名
gettimeofday
1.5.2函数原形
int gettimeofday(struct timeval *tv, struct timezone *tz)
1.5.3函数功能
获取高精度时间,时间(秒和微秒)保存在tv中,
1.5.4所属头文件
1.5.5返回值
成功:0
失败:-1
1.5.6参数说明
tv:带有秒和微秒的结构体指针,从1970年1月1日0:0:0开始到现在经历的秒数和微秒数
tz:通常为空
1.5.7示例代码
统计一个程序执行的时间
程序结果
花了9222微秒的时间。
下面就写一个显示日历的程序来巩固上面学习的函数。程序的功能是,只要一执行,就显示本地时间这个月的日历。
#includevoid main() { time_t t; struct tm *shijian; int i; int day=1; int month,year,week,mon_day; /*获取日历时间*/ time(&t); /*将日历时间转化为本地时间*/ shijian = localtime(&t); /*得到年*/ year = shijian->tm_year + 1900; /*得到月*/ month = shijian->tm_mon + 1; /*得到这个月的第一天是星期几*/ week = shijian->tm_wday - shijian->tm_mday%7 + 1; /*************得到这个月应该有多少天***********/ if(month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12 ) mon_day = 31; else if(month == 4 || month == 6 || month == 9 || month == 11) mon_day = 30; else { if(year % 400 == 0 || (year%4==0) &&(year%100!=0)) mon_day = 29; else mon_day = 28; } /**********************************************/ printf(" %-4d%d\n",month,year); printf("Su Mo Tu We Th Fr Sa\n"); for(i=0; i 程序执行的结果:
上面是我写的程序执行的效果,下面是linux自带的cal命令显示日历的执行效果。看出来,写的程序执行的结果是正确的。