一、说明
一般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却能精确到微妙级别,在很多高精度的场合里具有很高的价值。