最近要为自己的项目开发一个日志模块,需要获取精确到微秒级的系统时间,查阅了一些资料,发现在C/C++里面可以通过 gettimeofday(struct timeval * tv,struct timezone * tz) 和 localtime(const time_t * timep) 这两个函数的配合使用来得到我想要的结果。
先贴一下这两个函数的说明
gettimeofday
头文件:#include <sys/time.h> #include <unistd.h>
函数定义:int gettimeofday (struct timeval * tv, struct timezone * tz);
函数说明:gettimeofday()会把目前的时间有tv 所指的结构返回,当地时区的信息则放到tz 所指的结构中。时间是从公元 1970 年1 月1 日的UTC 时间从0 时0 分0 秒算起到现在所经过的时间。
timeval 结构定义为:
struct timeval
{
long tv_sec; // 秒
long tv_usec; // 微秒
};
timezone 结构定义为:
struct timezone
{
int tz_minuteswest; // 和格林威治时间差了多少分钟
int tz_dsttime; // 日光节约时间的状态
};
localtime
头文件:#include <time.h>
函数定义:**struct tm localtime (const time_t timep);
函数说明:localtime()将参数timep 所指的time_t 结构中的信息转换成真实世界所使用的时间日期表示方法,然后将结果由结构tm 返回。
结构tm 的定义为:
int tm_sec; // 代表目前秒数, 正常范围为0-59, 但允许至61 秒
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
int tm_yday; // 从今年1 月1 日算起至今的天数, 范围为0-365
int tm_isdst; // 日光节约时间的旗标
使用localtime函数的时候需要注意计算年份的时候需要加上1900,计算月份的时候需要加1。
使用说明
我们先调用gettimeofday函数获取到从公元 1970年1 月1 日的UTC 时间从0 时0 分0 秒算起到现在所经过的秒数加上微秒数,然后将秒数作为参数再调用localtime函数,转换为本地时区的当前时间即可,之后可以使用localtime函数返回的tm结构体对象来获取具体的年月日时分秒等数据。
示例代码
#include <iostream>
#include <string>
#include <stdio.h>
#include <sys/time.h>
#include <time.h>
#include <unistd.h>
using namespace std;
string fa_getSysTime()
{
struct timeval tv;
gettimeofday(&tv,NULL);
struct tm* pTime;
pTime = localtime(&tv.tv_sec);
charsTemp[30] = {0};
snprintf(sTemp, sizeof(sTemp), "%04d%02d%02d%02d%02d%02d%03d%03d", pTime->tm_year+1900, \
pTime->tm_mon+1, pTime->tm_mday, pTime->tm_hour, pTime->tm_min, pTime->tm_sec, \
tv.tv_usec/1000,tv.tv_usec%1000);
return (string)sTemp;
}
int main()
{
cout<< "当前时间:" << fa_getSysTime() << endl;
return 0;
}
输出为
当前时间:20140930110457794678