weiqi7777

进击吧,linux(十) 时间编程

0
阅读(2045)

利用linux提供的时间相关的函数,可以获取时间。

时间类型是有两种:

1、UTC,也就是世界标准时间。也称为格林威治标准时间。

2、Calendar time,日历时间,从一个时间点(197011000秒)到目前的时间所经历的秒数。

clip_image002

内核提供一个time函数,可以得到日历时间。然后通过gmtime函数或者localtime函数,得到tm的时间格式。tm中包括了我们所用的时间,年月日等等。然后再通过asctime函数,可以将tm的时间格式给转化成字符串,方便我们查看。

下面就是各个函数的学习。同样,还是使用学习模板来学习。

1.1获取日历时间

1.1.1函数名

time

1.1.2函数原形

time(time_t *t)

1.1.3函数功能

获取日历时间

1.1.4所属头文件

1.1.5返回值

成功:返回日历时间(1970110时到现在的时间,以秒为单位)

失败:-1

1.1.6参数说明

t:如果t不为空,保存返回值。也可以为空。

1.1.7示例代码

clip_image003

clip_image004

程序的结果就是日历时间,以秒为单位的。这个时间就很不直观了。需要自己对这个数据转化。

1.2获取格林威治时间

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结构体存储

clip_image006

失败:NULL

1.2.6参数说明

timep待转化的日历时间

1.2.7示例代码

clip_image008

clip_image009

这样,时间就有可读性了,不过这时间是世界标准时间,不是本地的时间。注意年是从1900年算起的,所以年需要加上1900才是现在的年。月是从0开始的,所以需要加1

1.3获取本地时间

1.3.1函数名

localtime

1.3.2函数原形

struct tm *localtime(const time_t *timep)

1.3.3函数功能

将日历时间转化为本地时间

1.3.4所属头文件

1.3.5返回值

成功:本地时间,以tm结构体存储

clip_image010

失败:NULL

1.3.6参数说明

timep待转化的日历时间

1.3.7示例代码

clip_image012

clip_image014

这样,就得到了本地的时间了。

1.4以字符串方式显示时间

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示例代码

clip_image015

运行结果,时间显示就更有可读性了。

clip_image016

1.5获取高精度时间

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:带有秒和微秒的结构体指针,从1970110:0:0开始到现在经历的秒数和微秒数

clip_image018

tz通常为空

clip_image020

1.5.7示例代码

统计一个程序执行的时间

clip_image022

程序结果

clip_image023

花了9222微秒的时间。

下面就写一个显示日历的程序来巩固上面学习的函数。程序的功能是,只要一执行,就显示本地时间这个月的日历。

#include void 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
       

程序执行的结果:

clip_image024

上面是我写的程序执行的效果,下面是linux自带的cal命令显示日历的执行效果。看出来,写的程序执行的结果是正确的。

Baidu
map