Linux c/c++中提供了很多操作时间的库函数,这里简要介绍。
使用头文件 #include
常用的时间函数包括以下:
time
time_t time(time_t *t);
localtime
struct tm *localtime(const time_t * timep);
struct tm {
int tm_sec;
int tm_min;
int tm_hour;
int tm_mday;
int tm_mon;
int tm_year;
int tm_wday;
int tm_yday;
int tm_isdst;
};
gettimeofday
int gettimeofday ( struct timeval * tv , struct timezone * tz )
struct timeval {
long tv_sec; /*秒*/
long tv_usec; /*微秒*/
};
struct timezone {
int tz_minuteswest; /*和Greenwich 时间差了多少分钟*/
int tz_dsttime; /*日光节约时间的状态*/
};
ctime
char *ctime(const time_t *timep);
Wed Jun 30 21 :49 :08 1993
asctime
char * asctime(const struct tm * timeptr);
Wed Jun 30 21:49:08 1993\n
gmtime
struct tm* gmtime(const time_t*timep);
settimeofday
int settimeofday ( const struct timeval *tv,const struct timezone *tz);
更多详细信息请使用man手册。
可以结合time, localtime, strftime
得到本地时间,精确到秒。代码如下:
static string CurrentLocalTime(void)
{
time_t t; //秒时间
tm *local; //本地时间
char buf[128] = {0};
t = time(NULL); //获取目前秒时间
local = localtime(&t); //转为本地时间,注意,该函数非线程安全,下面的例子会使用线程安全函数localtime_r
strftime(buf, 64, "%Y-%m-%d %H:%M:%S", local); //根据需要自定义格式
return buf;
}
要想得到精确到毫秒的时间,就需要使用gettimeofday
了。代码如下:
/**
* @name: GetLocalTimeWithMs
* @msg: 获取本地时间,精确到毫秒
* @param {type}
* @return: string字符串,格式为YYYYMMDDHHMMSSsss,如:20190710130510368
*/
static string GetLocalTimeWithMs(void)
{
string defaultTime = "19700101000000000";
try
{
struct timeval curTime;
gettimeofday(&curTime, NULL);
int milli = curTime.tv_usec / 1000;
char buffer[80] = {0};
struct tm nowTime;
localtime_r(&curTime.tv_sec, &nowTime);//把得到的值存入临时分配的内存中,线程安全
strftime(buffer, sizeof(buffer), "%Y%m%d%H%M%S", &nowTime);
char currentTime[84] = {0};
snprintf(currentTime, sizeof(currentTime), "%s%03d", buffer, milli);
return currentTime;
}
catch(const std::exception& e)
{
return defaultTime;
}
catch (...)
{
return defaultTime;
}
}
得到字符串表示的本地时间信息后,可根据需要对字符串进行操作,简单方便。
c11提供了chrono,专门用来处理时间相关任务。它是子命名空间,位于std下。详细内容可以参考 std::chrono。
这里介绍一下常用的两种场景:获取当前时间戳和计算时间跨度(可以用来计算某段程序的耗时)。
// get current local time stamp
int64_t getCurrentLocalTimeStamp()
{
std::chrono::time_point<std::chrono::system_clock, std::chrono::milliseconds> tp = std::chrono::time_point_cast<std::chrono::milliseconds>(std::chrono::system_clock::now());
auto tmp = std::chrono::duration_cast<std::chrono::milliseconds>(tp.time_since_epoch());
return tmp.count();
// return std::chrono::duration_cast(std::chrono::system_clock::now().time_since_epoch()).count();
}
其中,system_clock是系统级的时钟,能够获取当前的 time_point。它的 now 静态成员方法用来获取当前时间。
time_point 的 time_since_epoch 成员方法获取 1970 以来的时间。
然后通过 time_point_cast 或者 duration_cast 的 count 方法获取具体时间。
int countTimeConsume()
{
using namespace std::chrono;
high_resolution_clock::time_point t1 = high_resolution_clock::now();
std::cout << "printing out 1000 stars...\n";
for (int i = 0; i < 1000; ++i)
std::cout << "*";
std::cout << std::endl;
high_resolution_clock::time_point t2 = high_resolution_clock::now();
duration<double, std::milli> time_span = t2 - t1;
std::cout << "It took me " << time_span.count() << " milliseconds.";
std::cout << std::endl;
return 0;
}
关于 system_clock、steady_clock、high_resolution_clock 的具体说明及区别,可能参考Difference between std::system_clock and std::steady_clock。
本地时间的获取在各种程序中使用率较高,可以放在项目的util中,供所有代码使用。
由于还没有理解透彻,不当之处请不吝指出哈。