timeval精确到微秒 (在time.h中)
struct timeval
{
time_t tv_sec; /* seconds */ long
suseconds_t tv_usec; /* microseconds */ long
};
2、常用的时间函数
#include<time.h>
#include<sys/time.h>
#include<iostream>
#include<thread>
int main()
{
time_t time(NULL);
std::cout<<time<<std::endl; //0
::time(&time); //取得从1970年1月1日至今的秒数
std::cout<<time<<std::endl; //1550038698
//char *ctime(const time_t *timep); //以字符串的形式显示
std::cout<<ctime(&time)<<std::endl; //Wed Feb 13 14:18:18 2019
//struct tm *gmtime(const time_t *timep); //转换为没有经过时区转换的UTC时间
struct tm *gtm = gmtime(&time);
//char *asctime(const struct tm *tm); //以字符串的形式显示
std::cout<<asctime(gtm)<<std::endl; //Wed Feb 13 06:18:18 2019
//struct tm *localtime(const time_t *timep); //经过时区转换的时间。
struct tm *ltm = localtime(&time);
std::cout<<asctime(ltm)<<std::endl; //Wed Feb 13 14:18:18 2019
//time_t mktime(struct tm *tm); //转换为从1970年至今的秒数
time_t gt = mktime(gtm);
std::cout<<gt<<std::endl; //1550038698
time_t lt = mktime(ltm);
std::cout<<lt<<std::endl; //1550038698
std::this_thread::sleep_for(std::chrono::seconds(1));
//返回当前距离1970年的秒数和微秒数,后面的tz是时区,一般不用。#include<sys/time.h>
//int gettimeofday(struct timeval *tv, struct timezone *tz);
timeval tv;
gettimeofday(&tv, NULL);
std::cout<<tv.tv_sec<<std::endl; //1550038699
std::cout<<tv.tv_usec<<std::endl;//262911
//double difftime(time_t time1, time_t time2); //秒数 time1-time2
std::cout<<difftime(tv.tv_sec, time)<<std::endl;// 1
std::cout<<tv.tv_sec - time<<std::endl;// 1
}
4、关于localtime与localtime_r的区别
struct tm *localtime(const time_t *timep);
返回的是一个指针,实际的内存是localtime内部通过static申请的静态内存,线程不安全
struct tm *localtime_r(const time_t *timep, struct tm *result);
localtime_r则是由调用者在第二个参数传入一个struct tm result指针,
多线程应用里面,应该用localtime_r函数替代localtime函数,因为localtime_r是线程安全的。
其他的时间函数,如asctime,asctime_r;ctime,ctime_r;gmtime,gmtime_r都是类似的,所以,时间函数的 _r 版本都是线程安全的。