红联Linux门户
Linux帮助

Linux下时间编程

发布时间:2016-05-24 11:22:39来源:linux网站作者:CodeHeng

一、说明

一般Linux下提供的时间服务都是从国际标准时间公元1970年1月1日00:00:00以来经过的秒数,这种类型用time_t表示,一般我们称之为日历时间,这是我们要用的源。


二、获取系统时间并转成字符串步骤

#include <time.h> 
time_t time(time_t *calptr); 

time函数总是以NULL为参数,返回的是当前的时间和日期,也就是从1970年1月1日00:00:00以来经过的秒数,也叫日历时间。

#include <sys/time.h> 
int gettimeofday(struct timeval *tv, struct timezone *tz); 

gettimeofday比time提供了更高的分辨率,可以精确到微妙,时间值保存到timeval结构中,tz唯一有效的值是NULL,其他的值将产生不确定的结果。

struct timeval  


time_t      tv_sec;     /* seconds,也是日历时间 */ 
suseconds_t tv_usec;    /* microseconds */ 
}; 

拿到日历时间后,可以使用localtime或者gmtime来转成以年月日时分秒表示的时间,但是这个时间是保存到一个结构里,当然也可以使用ctime直接转成我们熟悉的字符串形式。

struct tm *gmtime(const time_t *timep); 
struct tm *localtime(const time_t *timep); 

char *ctime(const time_t *timep); 

tm的结构如下:

struct tm { 
int tm_sec;         /* seconds */ 
int tm_min;         /* minutes */ 
int tm_hour;        /* hours */ 
int tm_mday;        /* day of the month */ 
int tm_mon;         /* month */ 
int tm_year;        /* year */ 
int tm_wday;        /* day of the week */ 
int tm_yday;        /* day in the year */ 
int tm_isdst;       /* daylight saving time */ 
}; 

还有一个函数可以把tm结构反转为日历时间:mktime

time_t mktime(struct tm *tm); 

获得了tm结构的时间,也可以转成我们熟悉的字符串形式来表现:asctime

char *asctime(const struct tm *tm); 

参数tm为所获得的时间结构,返回的是一个字符串。


三、代码举例

/*sample.c*/ 
#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <string.h> 
#include <sys/time.h>   /*用于gettimeofday,精确到微妙级别*/ 
int main(void) 

time_t t; 
struct tm *mytm; 
struct timeval myval; 
char *buf; 
buf = malloc(30); 
mytm = malloc(sizeof(struct tm)); 
bzero(&myval, sizeof(myval)); 
t = time(NULL);/*获取日历时间*/ 
buf = ctime(&t);/*把日历时间直接转成字符串形式*/ 
printf("ctime out:%s\n", buf); 
//mytm = localtime(&t);/*localtime把日历时间转成tm结构形式*/ 
mytm = gmtime(&t);/*gmtime把日历时间转成tm结构形式*/ 
buf = asctime(mytm);/*转成字符串形式*/ 
printf("asctime out:%s\n", buf); 
gettimeofday(&myval, NULL); 
printf("t = %ld, seconds:%ld, microseconds:%ld\n", t, myval.tv_sec, myval.tv_usec); 
return 0;    

输出结果如下:

root@ubuntu:/media/work/test/time# ./sample 
ctime out:Wed Dec  3 09:39:11 2016 
asctime out:Wed Dec  3 01:39:11 2016 
t = 1417570751, seconds:1417570751, microseconds:11031 
root@ubuntu:/media/work/test/time#  

可以看到t和seconds是相同的,但是gettimeofday却能精确到微妙级别,在很多高精度的场合里具有很高的价值。


本文永久更新地址:http://www.linuxdiyf.com/linux/20904.html