这里只做展示作用,可能更新不及时,获取源码请移步gitee个人仓库:time
Time.hpp
#ifndef SINICH_EVEEN_TIME
#define SINICH_EVEEN_TIME
/*
*Environment:
*Linux(Ubuntu), C++11,gcc (Ubuntu 7.4.0-1ubuntu1~18.04.1) 7.4.0
*Description:
*时间计算类
*/
#include <chrono>
#include <ctime>
#include <string>
#include <cstring>
//参数流向
#define IN
#define OUT
#define INOUT
using std::time_t;
using std::string;
using std::mktime;
using namespace std::chrono;
namespace sinicheveen
{
class Time
{
public:
//检验 struct tm* 是否合法
inline static bool checkTM(IN struct tm* pTime_tm);
//获取当前标准时间
inline static string getCurrStdTime(IN const char* szTimeFormat = "%Y-%m-%d %H:%M:%S");
//获取当前时间戳(默认毫秒级别)
template<class T = milliseconds>
inline static int64_t getCurrTimeStampByChrono();
//获取当前时间戳(毫秒级别)
inline static int64_t getCurrTimeStampByCTime();
//根据年龄获取出生日期时间戳(毫秒级别)
inline static int64_t getTimeStampByAge(IN const int32_t age);
//根据出生年月日获取出生日期时间戳(毫秒级别)
inline static bool getTimeStampByYMD(IN const string& strBornYMD, OUT int64_t& dlTimeStamp);
//标准时间转毫秒级时间戳,标准时间格式:「YYYY-MM-DD HH:MM:SS」
inline static int64_t stdTimeToTimeStamp(IN const string& strStdTime);
//毫秒级时间戳转标准时间,标准时间格式:「YYYY-MM-DD HH:MM:SS」
inline static string timeStampToStdTime(IN const int64_t timeStamp);
}; //Time
/*
*Name:checkTM
*Description:检验 struct tm* 是否合法
*Input:IN struct tm* pTime_tm,时间
*Return:bool,合法返回true,否则返回false
*Caution:
*/
inline bool Time::checkTM(IN struct tm* pTime_tm)
{
if (nullptr == pTime_tm)
{
return false;
}
if (pTime_tm->tm_mon < 0 || pTime_tm->tm_mon > 11
|| pTime_tm->tm_mday < 1 || pTime_tm->tm_mday > 31
|| pTime_tm->tm_hour < 0 || pTime_tm->tm_hour > 23
|| pTime_tm->tm_min < 0 || pTime_tm->tm_min > 59
|| pTime_tm->tm_sec < 0 || pTime_tm->tm_sec > 59)
{
return false;
}
if (4 == (pTime_tm->tm_mon + 1) || 6 == (pTime_tm->tm_mon + 1) || 9 == (pTime_tm->tm_mon + 1) || 11 == (pTime_tm->tm_mon + 1)) //小月有30天
{
if (pTime_tm->tm_mday > 30)
{
return false;
}
}
if (2 == (pTime_tm->tm_mon + 1)) //2月
{
if ((0 == ((pTime_tm->tm_year + 1900) % 400)) || ((0 == ((pTime_tm->tm_year + 1900) % 4)) && (0 != ((pTime_tm->tm_year + 1900) % 100))))
{
if (pTime_tm->tm_mday > 29) //闰年2月份有29天
{
return false;
}
}
else //平年2月份有28天
{
if (pTime_tm->tm_mday > 28)
{
return false;
}
}
}
return true;
} //checkTM()
/*
*Name:getCurrStdTime
*Description:获取当前标准时间
*Input:IN const char* szTimeFormat,时间格式
*Return:string,系统当前时间
*Caution:
*/
inline string Time::getCurrStdTime(IN const char* szTimeFormat)
{
time_t currTime_t;
time(&currTime_t);
struct tm* locTime_tm = localtime(&currTime_t); //转换成本地日历时间
char szStdTime[50] = { "" }; //自定义格式存储位置
strftime(szStdTime, 50, szTimeFormat, locTime_tm);
return string(szStdTime);
} //getCurrStdTime()
/*
*Name:getCurrTimeStampByChrono
*Description:获取当前时间戳(默认毫秒级别)
*Input:
*Return:int64_t,时间戳,默认毫秒级别
*Caution:
*/
template<class T>
inline int64_t Time::getCurrTimeStampByChrono()
{
system_clock::time_point currentTime_tp = system_clock::now(); //当前时间
system_clock::duration timeSinceEpoch_du = currentTime_tp.time_since_epoch(); //从 Epoch 到现的纳秒数
int64_t dlTimeStamp = duration_cast<T>(timeSinceEpoch_du).count(); //时间转换,默认毫秒级别
return dlTimeStamp;
} //getCurrTimeStampByChrono()
/*
*Name:getCurrTimeStampByCTime
*Description:获取当前时间戳(毫秒级别)
*Input:
*Return:int64_t,时间戳
*Caution:
*/
inline int64_t Time::getCurrTimeStampByCTime()
{
return time(NULL) * 1000;
} //getCurrTimeStampByCTime()
/*
*Name:getTimeStampByAge
*Description:根据年龄获取出生日期时间戳(毫秒级别)
*Input:IN const int32_t age,年龄
*Return:int64_t,出生日期时间戳(毫秒级别)
*Caution:
*/
inline int64_t Time::getTimeStampByAge(IN const int32_t age)
{
time_t currTime_t;
time(&currTime_t);
struct tm* locTime_tm = localtime(&currTime_t); //转换成本地日历时间
locTime_tm->tm_year = locTime_tm->tm_year - age;
locTime_tm->tm_hour = 0;
locTime_tm->tm_min = 0;
locTime_tm->tm_sec = 0;
return mktime(locTime_tm) * 1000;
} //getTimeStampByAge()
/*
*Name:getTimeStampByYMD
*Description:根据出生年月日获取出生日期时间戳(毫秒级别)
*Input:IN const string& strBornYMD,出生年月日
OUT int64_t& dlTimeStamp,出生日期时间戳(毫秒级别)
*Return:bool,如果出生年月日不合法返回false,否则时间戳获取成功返回true
*Caution:
*/
inline bool Time::getTimeStampByYMD(IN const string& strBornYMD, OUT int64_t& dlTimeStamp)
{
struct tm* pLocTime_tm = (struct tm*)malloc(sizeof(struct tm));
memset(pLocTime_tm, 0, sizeof(struct tm));
strptime(strBornYMD.c_str(), "%Y-%m-%d", pLocTime_tm);
if (true != checkTM(pLocTime_tm))
{
free(pLocTime_tm);
return false;
}
dlTimeStamp = mktime(pLocTime_tm) * 1000;
free(pLocTime_tm);
return true;
}
/*
*Name:stdTimeToTimeStamp
*Description:标准时间转毫秒级时间戳,标准时间格式:「YYYY-MM-DD HH:MM:SS」
*Input:IN const string& strStdTime,标准时间
*Return:int64_t,如果标准时间正确,返回对应的时间戳,否则返回-1
*Caution:
*/
inline int64_t Time::stdTimeToTimeStamp(IN const string& strStdTime)
{
struct tm* pLocTime_tm = (struct tm*)malloc(sizeof(struct tm));
strptime(strStdTime.c_str(), "%Y-%m-%d %H:%M:%S", pLocTime_tm);
if (true != checkTM(pLocTime_tm))
{
free(pLocTime_tm);
return -1;
}
int64_t dlTimeStamp = mktime(pLocTime_tm) * 1000;
free(pLocTime_tm);
return dlTimeStamp;
} //stdTimeToTimeStamp()
/*
*Name:timeStampToStdTime
*Description:毫秒级时间戳转标准时间,标准时间格式:「YYYY-MM-DD HH:MM:SS」
*Input:IN const int64_t timeStamp,毫秒级时间戳
*Return:string,标准时间,标准时间格式:「YYYY-MM-DD HH:MM:SS」
*Caution:
*/
inline string Time::timeStampToStdTime(IN const int64_t timeStamp)
{
time_t timeStamp_t = timeStamp / 1000;
struct tm* pLocTime_tm;
pLocTime_tm = localtime(&timeStamp_t); //转换成本地日历时
char szTimeStr[20] = { 0 }; //储存标准时间
strftime(szTimeStr, 50, "%Y-%m-%d %H:%M:%S", pLocTime_tm); //转换时间格式
return szTimeStr;
} //timeStampToStdTime()
} //sinicheveen
#endif //SINICH_EVEEN_TIME
原文链接: https://www.cnblogs.com/sinicheveen/p/13718195.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/203185
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!