212 lines
5.4 KiB
C++
212 lines
5.4 KiB
C++
|
|
#include <cstring>
|
|||
|
|
#include "TimeUtil.h"
|
|||
|
|
|
|||
|
|
namespace ai_matrix
|
|||
|
|
{
|
|||
|
|
const int TIME_DIFF = 28800; // 8 hour
|
|||
|
|
TimeUtil *TimeUtil::ins = nullptr;
|
|||
|
|
TimeUtil::GarbageCollector TimeUtil::gc;
|
|||
|
|
std::mutex TimeUtil::mx;
|
|||
|
|
|
|||
|
|
TimeUtil *TimeUtil::getins()
|
|||
|
|
{
|
|||
|
|
//双层锁,确保线程安全
|
|||
|
|
if (ins == nullptr)
|
|||
|
|
{
|
|||
|
|
std::lock_guard<std::mutex> guard(mx); //防止异常发生不能解锁
|
|||
|
|
if (ins == nullptr)
|
|||
|
|
{
|
|||
|
|
ins = new TimeUtil();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
return ins;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取用于文件命名的时间戳
|
|||
|
|
* @return
|
|||
|
|
*/
|
|||
|
|
std::string TimeUtil::get_timestamp_file()
|
|||
|
|
{
|
|||
|
|
time_t timep = time(NULL);
|
|||
|
|
struct tm *p = localtime(&timep);
|
|||
|
|
|
|||
|
|
struct timeval tv;
|
|||
|
|
gettimeofday(&tv, NULL);
|
|||
|
|
|
|||
|
|
int msec = tv.tv_usec / 1000;
|
|||
|
|
|
|||
|
|
char tmp[30] = {0};
|
|||
|
|
sprintf(tmp, "%04d-%02d-%02d-%02d-%02d-%02d-%03d", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec, msec);
|
|||
|
|
|
|||
|
|
return std::string(tmp);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取用用于日志记录的时间
|
|||
|
|
* @return yyyy-MM-dd hh:mm:ss.us
|
|||
|
|
*/
|
|||
|
|
std::string TimeUtil::getDateTime_usec()
|
|||
|
|
{
|
|||
|
|
time_t timep = time(NULL);
|
|||
|
|
struct tm *p = localtime(&timep);
|
|||
|
|
|
|||
|
|
struct timeval tv;
|
|||
|
|
gettimeofday(&tv, NULL);
|
|||
|
|
|
|||
|
|
int msec = tv.tv_usec / 1000;
|
|||
|
|
|
|||
|
|
char tmp[30] = {0};
|
|||
|
|
sprintf(tmp, "%04d-%02d-%02d %02d:%02d:%02d.%03d", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec, msec);
|
|||
|
|
|
|||
|
|
return std::string(tmp);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取北京当前日期
|
|||
|
|
* @return : 日期 yyyy-mm-dd
|
|||
|
|
*/
|
|||
|
|
std::string TimeUtil::getDate()
|
|||
|
|
{
|
|||
|
|
struct timeval time = {0, 0};
|
|||
|
|
gettimeofday(&time, nullptr);
|
|||
|
|
time_t timep = time.tv_sec + TIME_DIFF;
|
|||
|
|
|
|||
|
|
struct tm *p = gmtime(&timep);
|
|||
|
|
|
|||
|
|
char szTmp[12] = {0};
|
|||
|
|
sprintf(szTmp, "%04d-%02d-%02d", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday);
|
|||
|
|
|
|||
|
|
return std::string(szTmp);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取北京当前时间
|
|||
|
|
* @return : 时间 hh:mm:ss
|
|||
|
|
*/
|
|||
|
|
std::string TimeUtil::getTime()
|
|||
|
|
{
|
|||
|
|
struct timeval time = {0, 0};
|
|||
|
|
gettimeofday(&time, nullptr);
|
|||
|
|
time_t timep = time.tv_sec + TIME_DIFF;
|
|||
|
|
|
|||
|
|
struct tm *p = gmtime(&timep);
|
|||
|
|
|
|||
|
|
char szTmp[10] = {0};
|
|||
|
|
sprintf(szTmp, "%02d:%02d:%02d", p->tm_hour, p->tm_min, p->tm_sec);
|
|||
|
|
return std::string(szTmp);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取当前 日期+时间
|
|||
|
|
* @return yyyy-MM-dd hh:mm:ss
|
|||
|
|
*/
|
|||
|
|
std::string TimeUtil::getDateTime()
|
|||
|
|
{
|
|||
|
|
struct timeval time = {0, 0};
|
|||
|
|
gettimeofday(&time, nullptr);
|
|||
|
|
time_t timep = time.tv_sec + TIME_DIFF;
|
|||
|
|
|
|||
|
|
struct tm *p = gmtime(&timep);
|
|||
|
|
int msec = time.tv_usec / 1000;
|
|||
|
|
|
|||
|
|
char szTmp[32] = {0};
|
|||
|
|
sprintf(szTmp, "%04d-%02d-%02d %02d:%02d:%02d", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec);
|
|||
|
|
|
|||
|
|
return std::string(szTmp);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取用于文件名的时间
|
|||
|
|
* @return hh-mm-ss
|
|||
|
|
*/
|
|||
|
|
std::string TimeUtil::getTime_file()
|
|||
|
|
{
|
|||
|
|
time_t timep = time(NULL);
|
|||
|
|
struct tm *p = localtime(&timep);
|
|||
|
|
|
|||
|
|
struct timeval tv;
|
|||
|
|
gettimeofday(&tv, NULL);
|
|||
|
|
|
|||
|
|
int msec = tv.tv_usec / 1000;
|
|||
|
|
|
|||
|
|
char tmp[10] = { 0 };
|
|||
|
|
sprintf(tmp, "%02d-%02d-%02d", p->tm_hour, p->tm_min, p->tm_sec);
|
|||
|
|
|
|||
|
|
return std::string(tmp);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
*
|
|||
|
|
* inParam : N/A
|
|||
|
|
* outParam: N/A
|
|||
|
|
* return : 时间戳
|
|||
|
|
*/
|
|||
|
|
/**
|
|||
|
|
* 获取当前时间距1970年的秒数(可选毫秒数)
|
|||
|
|
* @param usec 是否取毫秒数
|
|||
|
|
* @return
|
|||
|
|
*/
|
|||
|
|
uint64_t TimeUtil::getCurrentTimeMillis(bool usec)
|
|||
|
|
{
|
|||
|
|
struct timeval tv;
|
|||
|
|
gettimeofday(&tv, NULL);
|
|||
|
|
if (usec)
|
|||
|
|
return tv.tv_sec * 1000 + tv.tv_usec / 1000;
|
|||
|
|
else
|
|||
|
|
return tv.tv_sec;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取指定时间距1970年的秒数 (入参格式:YYYY-MM-DD hh-mm-ss)
|
|||
|
|
* inParam : std::string &strDateTime 日期时间
|
|||
|
|
* outParam: N/A
|
|||
|
|
* return : 时间戳
|
|||
|
|
*/
|
|||
|
|
uint64_t TimeUtil::getParamTimeMilliSeconds(std::string &strDateTime)
|
|||
|
|
{
|
|||
|
|
// LogDebug << "strDateTime:" << strDateTime;
|
|||
|
|
if (strDateTime.length() != 19)
|
|||
|
|
{
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int iYear = atoi(strDateTime.substr(0, 4).c_str());
|
|||
|
|
int iMon = atoi(strDateTime.substr(5, 2).c_str());
|
|||
|
|
int iDay = atoi(strDateTime.substr(8, 2).c_str());
|
|||
|
|
int iHour = atoi(strDateTime.substr(11, 2).c_str());
|
|||
|
|
int iMin = atoi(strDateTime.substr(14, 2).c_str());
|
|||
|
|
int iSec = atoi(strDateTime.substr(17, 2).c_str());
|
|||
|
|
|
|||
|
|
struct tm stm;
|
|||
|
|
memset(&stm, 0, sizeof(stm));
|
|||
|
|
stm.tm_year = iYear - 1900;
|
|||
|
|
stm.tm_mon = iMon - 1;
|
|||
|
|
stm.tm_mday = iDay;
|
|||
|
|
stm.tm_hour = iHour;
|
|||
|
|
stm.tm_min = iMin;
|
|||
|
|
stm.tm_sec = iSec;
|
|||
|
|
|
|||
|
|
uint64_t i64Ret = (uint64_t)mktime(&stm) * 1000;
|
|||
|
|
return i64Ret;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 获取指定毫秒数的对应的北京日期时间
|
|||
|
|
* inParam : uint64_t i64MilliSeconds
|
|||
|
|
* outParam: N/A
|
|||
|
|
* return : 日期时间
|
|||
|
|
*/
|
|||
|
|
std::string TimeUtil::getDateTimeByMilliSeconds(uint64_t i64MilliSeconds)
|
|||
|
|
{
|
|||
|
|
time_t timep = i64MilliSeconds / 1000 + TIME_DIFF;
|
|||
|
|
struct tm *p = gmtime(&timep);
|
|||
|
|
|
|||
|
|
char szTmp[32] = {0};
|
|||
|
|
sprintf(szTmp, "%04d-%02d-%02d %02d-%02d-%02d", 1900 + p->tm_year, 1 + p->tm_mon, p->tm_mday, p->tm_hour, p->tm_min, p->tm_sec);
|
|||
|
|
|
|||
|
|
return std::string(szTmp);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|