c++ linux 获取毫秒_C/C++以及Linux下的时间函数

一、time.h

#include

#include

int main()

{

time_t timer = time(NULL);

printf("ctime is %s\n",ctime(&timer)); //得到日历时间

return 0;

}

time.h是C/C++中的日期和时间头文件。

从系统时钟获取时间的方式

time_t time(time_t* timer)

得到从标准计时点(一般是1970年1月1日午夜)到当前时间的秒数。

clock_t clock(void)

得到从程序启动到此次函数调用时累计的毫秒数。

关于time_t

包含文件:

#ifndef __TIME_T

#define __TIME_T /* 避免重复定义 time_t */

typedef long time_t; /* 时间值time_t 为长整型的别名*/

#endif既然time_t实际上是长整型,到未来的某一天,从一个时间点(一般是1970年1月1日0时0分0秒)到那时的秒数(即日历时间)超出了长整形所能表示的数的范围怎么办?

对time_t数据类型的值来说,它所表示的时间不能晚于2038年1月18日19时14分07秒。

为了能够表示更久远的时间,一些编译器厂商引入了64位甚至更长的整形数来保存日历时间。

比如微软在Visual C++中采用了__time64_t数据类型来保存日历时间,并通过_time64()函数来获得日历时间(而不是通过使用32位字的time()函数),这样就可以通过该数据类型保存3001年1月1日0时0分0秒(不包括该时间点)之前的时间。

在time.h头文件中,我们还可以看到一些函数,它们都是以time_t为参数类型或返回值类型的函数:

double difftime(time_t time1, time_t time0);

time_t mktime(struct tm * timeptr);

time_t time(time_t * timer);

char * asctime(const struct tm * timeptr);

char * ctime(const time_t *timer);

二、sys/time.h

sys/time.h是Linux下特有的时间头文件

#include

#include

int main(int argc,char * argv[])

{

struct timeval tv;

while(1)

{

gettimeofday(&tv,NULL);

printf("time %u:%u\n",tv.tv_sec,tv.tv_usec);

sleep(2);

}

return 0;

}执行结果如上图

struct timeval结构体

该结构体是Linux系统中定义,struct timeval结构体在

sys/time.h

中的定义为:

struct timeval

{

__time_t tv_sec; /* Seconds. */

__suseconds_t tv_usec; /* Microseconds. */

};

其中,tv_sec为1970年1月1日0时0分0秒到now的的秒数,tv_usec为微秒数,即秒后面的零头。

需要注意的是,因为循环过程,新建结构体变量等过程需消耗部分时间,我们作下面的运算时得到的结果并不是整的2s

#include

#include

int

main(void)

{

int i;

struct timeval tv;

for(i = 0; i < 4; i++)

{

gettimeofday(&tv, NULL);

printf("%d\t%d\n", tv.tv_usec, tv.tv_sec);

sleep(2);

}

return 0;

}

ms部分有些许误差,多了一些输出或者创建对象的时间

三、

Unix/Linux都是采用UTC(Universal Coordinated Time),1970.1.1到现在的秒数,采用time_t(long int)存储。

下面介绍一些结构体和相关函数

1. 时间结构体

都定义在time.h头文件中,对余时间和日历的具体内容,包括

时间:time_t, timeval, time_spec, 精度越来越高

日历:tm

1.1 time_t

typedef long time_t

time_t表示为从UTC(coordinated universal time)时间1970年1月1日00时00分00秒(也称为Linux系统的Epoch时间)到当前时刻的秒数,只是精确到秒

1.2 timeval

struct timeval

{

time_t tv_sec; //秒 s

long tv_usec;//微秒us

};精确到微秒

1.3 timespec

struct timespec

{

long int tv_sec; //秒 s

long int tv_nsec; //纳秒 ns

}; 精确到纳秒

1.4 tm

struct tm{

int tm_sec; /*秒 - 取值区间为[0, 59]*/

int tm_min; /*分 - 取值区间为[0, 59]*/

int tm_hour; /*时 - 取值区间为[0, 23]*/

int tm_mday; /*日 - 取值区间为[1, 31]*/

int tm_mon; /*月份 - 取值区间为[0, 11]*/

int tm_year; /*年份 - 其值为1900年至今年数*/

int tm_wday; /*星期 - 取值区间[0, 6],0代表星期天,1代表星期1,以此类推*/

int tm_yday; /*从每年的1月1日开始的天数-取值区间为[0, 365],0代表1月1日*/

int tm_isdst; /*夏令时标识符,使用夏令时,tm_isdst为正,不使用夏令时,tm_isdst为0,不了解情况时,tm_isdst为负*/

long int tm_gmtoff;

const char* tm_zone;

};

前9个成员是必须成员,最后2个成员根据系统会有不同。

tm_gmtoff:指定了日期变更线东面时区中UTC东部时区正秒数或UTC西部时区的负秒数

tm_zone:当前时区的名字(与环境变量TZ有关)

2. 获取系统时间

2.1 time_t time( time_t *t );

t和返回值都返回UTC时间,t可以为空

所在头文件 time.h

time_t cur_time;

time(&cur_time);

cur_time = time(NULL);

if ( cur_time == -1 )

{

perror("time");

exit(1);

}

printf("Current time : %d\n", cur_time);

//求time1和time2 的差值

double difftime( time_t time1 , time_t time2 );2.2 gettimeofday 获取更高的精度

头文件:sys/time.h

int gettimeofday(struct timeval*tv, struct timezone *tz);

struct timezone{

int tz_minuteswest;/*格林威治时间往西方的时差*/

int tz_dsttime;/*DST 时间的修正方式,一般为NULL*/

};

gettimeofday( )把目前的时间信息存入tv指向的结构体,当地时区信息则放到tz指向的结构体。3. timeval 运算

在sys/time.h中还定义了5个宏对timeval 进行算数运算

/*判断tvp是否填充*/

#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec)

/*tvp设置为0*/

#define timerclear(tvp) ((tvp)->tv_sec = (tvp)->tv_usec = 0)

/*tvp比较,cmp不可为>=, <=*/

#define timercmp(tvp, uvp, cmp)

((tvp)->tv_sec cmp (uvp)->tv_sec ||\

(tvp)->tv_sec == (uvp)->tv_sec &&\

(tvp)->tv_usec cmp (uvp)->tv_usec)

/*result = a+b*/

#define timeradd(a, b, result)

/*result = a-b*/

#define timersub(a, b, result)4. time_t -->tm

4.1 struct tm* gmtime( const time_t* p_time );

头文件:time.h

返回:国际标准时间(GMT)

#include

#include

int main()

{

char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

time_t timep;

struct tm *p_tm;

timep = time(NULL);

p_tm = gmtime(&timep); /*获取GMT时间*/

printf("%d-%d-%d ", (p_tm->tm_year+1900), (p_tm->mon+1), p_tm->tm_mday);

printf("%s %d:%d:%d\n", wday[p_tm->tm_wday], p_tm->tm_hour, p_tm->tm_min, p_tm->tm_sec);

}

4.2 struct tm* localtime( const time_t* p_time );

头文件:time.h

返回:本地时间(受时区影响,与环境变量TZ有关)

int main(void)

{

char *wday[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

time_t timep;

struct tm *p_tm;

timep = time(NULL);

p_tm = localtime(&timep); /*获取本地时区时间*/

printf("%d-%d-%d ", (p_tm->tm_year+1900), (p_tm->mon+1), p_tm->tm_mday);

printf("%s %d:%d:%d\n", wday[p_tm->tm_wday], p_tm->tm_hour, p_tm->tm_min, p_tm->tm_sec);

return 0;

}5. tm --> time_t

头文件:time.h

time_t mktime( struct tm* p_tm );

6. time --> char*

6.1 asctime

头文件:#include

函数定义:char *asctime(const struct tm *p_tm);

功能描述:asctime( )将参数p_tm指向的tm结构体数据转换成实际使用的时间日期表示方法,并以字符串形式返回(与ctime函数相同)。字符串格式为:"Wed Jun 20 21:00:00 2012\n"。

6.2 ctime

同asctime

ctime一率使用当地时间,asctime则用tm结构内的timezone资讯来表示。

7. 格式化 strftime strptime

7.1 size_t strftime(char *str,size_t max,char *fmt,struct tm *tp);

strftime有点像sprintf,其格式由fmt来指定。

%a : 本第几天名称,缩写。

%A : 本第几天名称,全称。

%b : 月份名称,缩写。

%B : 月份名称,全称。

%c : 与ctime/asctime格式相同。

%d : 本月第几日名称,由零算起。

%H : 当天第几个小时,24小时制,由零算起。

%I : 当天第几个小时,12小时制,由零算起。

%j : 当年第几天,由零算起。

%m : 当年第几月,由零算起。

%M : 该小时的第几分,由零算起。

%p : AM或PM。

%S : 该分钟的第几秒,由零算起。

%U : 当年第几,由第一个日开始计算。

%W : 当年第几,由第一个一开始计算。

%w : 当第几日,由零算起。

%x : 当地日期。

%X : 当地时间。

%y : 两位数的年份。

%Y : 四位数的年份。

%Z : 时区名称的缩写。

%% : %符号。

将下面的7.2的内容为大家分享完之后,有关Unix/Linux时间、日历函数的内容,达内IT培训老师就为同学们讲解完了,笔者不敢说自己分享的内容一定能够让你理解,所以读者们一定要认真阅读。

7.2 char * strptime(char *s,char *fmt,struct tm *tp);

如同scanf一样,解译字串成为tm格式。

%h : 与%b及%B同。

%c : 读取%x及%X格式。

%C : 读取%C格式。

%e : 与%d同。

%D : 读取%m/%d/%y格式。

%k : 与%H同。

%l : 与%I同。

%r : 读取"%I:%M:%S %p"格式。

%R : 读取"%H:%M"格式。

%T : 读取"%H:%M:%S"格式。

%y : 读取两位数年份。

%Y : 读取四位数年份。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值