228 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			228 lines
		
	
	
		
			5.9 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);
 | ||
|     }
 | ||
| 
 | ||
|     //时间戳转化为时间 毫秒级
 | ||
|     std::string TimeUtil::Stamp2Time(long long timestamp, bool has_msec)
 | ||
|     {
 | ||
|         int ms = timestamp % 1000;//取毫秒
 | ||
|         time_t tick = (time_t)(timestamp/1000);//转换时间
 | ||
|         struct tm tm;
 | ||
|         char s[40];
 | ||
|         tm = *localtime(&tick);
 | ||
|         strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", &tm);
 | ||
|         std::string str(s);
 | ||
|         if (has_msec)
 | ||
|         {
 | ||
|             str = str+ "." + std::to_string(ms);
 | ||
|         }
 | ||
|         return str;
 | ||
|     }
 | ||
| }
 |