时间

来源:互联网 发布:微信小程序 php 编辑:程序博客网 时间:2024/06/09 19:31
#include "GetTime.h"#include <sys/timeb.h>#include <sys/errno.h> using namespace lspublic::library::util;#ifndef WIN32struct timeval CGetTime::m_Counts[MAX_TIMES_COUNT];int CGetTime::m_nCount = 0;#endif// 判断时间是否合法BOOL CGetTime::IsValidTime(const char* szTime){int iLen;char szTmpStr[3];iLen = strlen(szTime);if ( iLen != 6 )return FALSE;for (int i = 0; i < iLen; i++){if (!isdigit(szTime[i]))return FALSE;}szTmpStr[2] = '\0';strncpy(szTmpStr, szTime, 2);if (strcmp(szTmpStr, "24") >= 0)return FALSE;strncpy(szTmpStr, szTime+2, 2);if (strcmp(szTmpStr,"60") >= 0)return FALSE;strncpy(szTmpStr, szTime+4, 2);if (strcmp(szTmpStr,"60") >= 0)return FALSE;return TRUE;}// 如果转换过程中保持不变,则为合法日期BOOL CGetTime::IsValidDate(const char* szDate){int iLen;char szDateTime[15];struct tm sTm;iLen = strlen(szDate);if ( iLen != 8 ) return FALSE;strcpy(szDateTime, szDate);strcpy(szDateTime+8, "000000");ConvertStringToTm(szDate, &sTm);strftime(szDateTime, 15, "%Y%m%d%H%M%S", &sTm);if (!strncmp(szDateTime, szDate, 8))return TRUE;elsereturn FALSE;}// 取得当前时间的字符串(YYYYMMDDHH24MISS)void CGetTime::GetNowDateTime(char* szDateTime){time_t iTime;iTime = time(NULL);struct tm tmTime;#ifdef WIN32tmTime=*localtime(&iTime);#elselocaltime_r(&iTime, &tmTime);#endifConvertTmToString(tmTime, szDateTime);}#ifndef WIN32//取当前时间 与GetNowDateTime相同,win下使用。void CGetTime::GetCurrentTime(char *szCurDate){struct tm tmNow;time_t timeNow;time(&timeNow);#ifdef WIN32tmNow = *localtime(&timeNow);#elselocaltime_r(&timeNow, &tmNow);#endifsprintf(szCurDate,"%4.4d%2.2d%2.2d%2.2d%2.2d%2.2d",tmNow.tm_year+1900,tmNow.tm_mon+1,tmNow.tm_mday,tmNow.tm_hour,tmNow.tm_min,tmNow.tm_sec);}#endif//取得当前日期的星期(1-7)int CGetTime::GetWeekDay(const char* szDate){struct tm tm;sscanf(szDate, "%04d%02d%02d", &tm.tm_year, &tm.tm_mon, &tm.tm_mday);tm.tm_year -= 1900;tm.tm_mon--;tm.tm_isdst = -1;mktime(&tm);if (tm.tm_wday == 0)tm.tm_wday = 7;return tm.tm_wday;}// 取得当前月份int CGetTime::GetMonth(){time_t lTime;struct tm cTm;lTime = time(NULL);#ifdef WIN32cTm = *localtime(&lTime);#elselocaltime_r(&lTime, &cTm);#endifreturn cTm.tm_mon+1;}// 取得字符串日期中的月份int CGetTime::GetMonth(const char* szDate){char szTmp[3];strncpy(szTmp, szDate+4, 2);szTmp[2] = '\0';return atoi(szTmp);}// 取得字符串日期中的月份int CGetTime::GetDay(const char* szDate){char szTmp[3];strncpy(szTmp, szDate+6, 2);szTmp[2] = '\0';return atoi(szTmp);}// 把tm结构的日期转换成字符串(YYYYMMDDHH24MISS)void CGetTime::ConvertTmToString(const struct tm cTm, char* szDateTime, const char* pSep1 ,const char* pSep2){if(pSep1 != NULL && pSep2 != NULL)sprintf(szDateTime, "%04.4d%s%02.2d%s%02.2d %02.2d%s%02.2d%s%02.2d",cTm.tm_year + 1900,pSep1,cTm.tm_mon + 1, pSep1,cTm.tm_mday,cTm.tm_hour,pSep2,cTm.tm_min,pSep2,cTm.tm_sec);else if(pSep2 != NULL)sprintf(szDateTime, "%04.4d%02.2d%02.2d %02.2d%s%02.2d%s%02.2d",cTm.tm_year + 1900,cTm.tm_mon + 1,cTm.tm_mday,cTm.tm_hour,pSep2,cTm.tm_min,pSep2,cTm.tm_sec);elsesprintf(szDateTime, "%04.4d%02.2d%02.2d%02.2d%02.2d%02.2d",cTm.tm_year + 1900,cTm.tm_mon + 1,cTm.tm_mday,cTm.tm_hour,cTm.tm_min,cTm.tm_sec);}// 把字符串的日期(YYYYMMDDHH24MISS)转换成tm结构BOOL CGetTime::ConvertStringToTm(const char *pdt, struct tm *dt){char szBuffer[7];struct tm tmStaTime;time_t lt;/* Get year */memcpy(szBuffer,pdt,4);szBuffer[4]=0;tmStaTime.tm_year=atoi(szBuffer)-1900;/* Get month */memcpy(szBuffer,pdt+4,2);szBuffer[2]=0;tmStaTime.tm_mon=atoi(szBuffer) - 1;/* Get day */memcpy(szBuffer,pdt+6,2);szBuffer[2]=0;tmStaTime.tm_mday=atoi(szBuffer);/* Get hour */memcpy(szBuffer,pdt+8,2);szBuffer[2]=0;tmStaTime.tm_hour=atoi(szBuffer);/* Get minute */memcpy(szBuffer,pdt+10,2);szBuffer[2]=0;tmStaTime.tm_min=atoi(szBuffer);/* Get second */memcpy(szBuffer,pdt+12,2);szBuffer[2]=0;tmStaTime.tm_sec=atoi(szBuffer);tmStaTime.tm_isdst = -1; /*daylight savings time*/lt=mktime(&tmStaTime);if(lt == -1) return FALSE;#ifdef WIN32tmStaTime=*localtime(<);#elselocaltime_r(<, &tmStaTime);#endif*dt=tmStaTime;return TRUE;}//转换日期格式 yyyymmddhh24miss to yyyymmdd hh24:mi:ss void CGetTime::TransHourFormat(char *aszDateIn, char *aszDateOut){struct tm sTm;ConvertStringToTm(aszDateIn, &sTm);ConvertTmToString(sTm, aszDateOut, NULL, ":");return;}//转换日期格式 yyyymmdd hh24:mi:ss to yyyymmddhh24missint CGetTime::TransTimeFormat(char *aszDateIn, char *aszDateOut, int anSize){char szBuf[20];int anPos = 0;memset(szBuf, 0x0 ,sizeof(szBuf));if(aszDateIn == NULL || strlen(aszDateIn) ==0)return -1;anPos = 0;for(int i=0; i<strlen(aszDateIn); i++){if(!isdigit(aszDateIn[i]))continue;else{szBuf[anPos] = aszDateIn[i];anPos++;}}szBuf[anPos] = '\0';strncpy(aszDateOut, szBuf, anSize);return 0;}// 计算起始时间和结束时间之间的间隔(秒数)int CGetTime::ComputeDuration(const char* szBegTime, const char* szEndTime){struct tm cBegTm;struct tm cEndTm;ConvertStringToTm(szBegTime, &cBegTm);ConvertStringToTm(szEndTime, &cEndTm);return mktime(&cEndTm)-mktime(&cBegTm);}//增加秒数int CGetTime::AddSecs(const char * aszDateIn,int32_t anSecs,char * aszDateOut, int32_t anSize){struct tm tmInDate,tmOutDate;time_t tTmp;char szTmp[5];char szDayTemp[51] = "";memset(&tmInDate,0,sizeof(struct tm));memcpy(szTmp,aszDateIn,4);szTmp[4] = '\0';tmInDate.tm_year = atoi(szTmp) - 1900;memcpy(szTmp,aszDateIn + 4,2);szTmp[2] = '\0';tmInDate.tm_mon = atoi(szTmp) - 1;memcpy(szTmp,aszDateIn + 6,2);szTmp[2] = '\0';tmInDate.tm_mday = atoi(szTmp);memcpy(szTmp,aszDateIn + 8,2);szTmp[2] = '\0';tmInDate.tm_hour = atoi(szTmp);memcpy(szTmp,aszDateIn + 10,2);szTmp[2] = '\0';tmInDate.tm_min = atoi(szTmp);memcpy(szTmp,aszDateIn + 12,2);szTmp[2] = '\0';tmInDate.tm_sec = atoi(szTmp);if ((tTmp = mktime(&tmInDate)) == (time_t)-1)return -1;tTmp = tTmp + anSecs;tmOutDate = *localtime(&tTmp);sprintf(szDayTemp,"%4.4d%2.2d%2.2d%2.2d%2.2d%2.2d",tmOutDate.tm_year + 1900,tmOutDate.tm_mon + 1,tmOutDate.tm_mday,tmOutDate.tm_hour, tmOutDate.tm_min, tmOutDate.tm_sec);strncpy(aszDateOut, szDayTemp, anSize);return 0;}//增加一天int CGetTime::AddDays(const char * aszDateIn,int32_t anDays,char * aszDateOut, int32_t anSize){struct tm tmInDate,tmOutDate;time_t tTmp;char szTmp[5];char szDayTemp[51] = "";/*change szInDate to tmDate1*/memset(&tmInDate,0,sizeof(struct tm));memcpy(szTmp,aszDateIn,4);szTmp[4] = '\0';tmInDate.tm_year = atoi(szTmp) - 1900;memcpy(szTmp,aszDateIn + 4,2);szTmp[2] = '\0';tmInDate.tm_mon = atoi(szTmp) - 1;memcpy(szTmp,aszDateIn + 6,2);szTmp[2] = '\0';tmInDate.tm_mday = atoi(szTmp);if ((tTmp = mktime(&tmInDate)) == (time_t)-1)return -1;tTmp = tTmp + (time_t)anDays * 86400;/*idays之后*/tmOutDate = *localtime(&tTmp);sprintf(szDayTemp,"%4.4d%2.2d%2.2d",tmOutDate.tm_year + 1900,tmOutDate.tm_mon + 1,tmOutDate.tm_mday);strncpy(aszDateOut, szDayTemp, anSize);return 0;}// 增加月份int  CGetTime::AddMonths(int nAcctMonth, int nMonths){intnRetAcctMonth;intnCurYear = nAcctMonth / 100, nCurMonth = nAcctMonth % 100;if (nMonths >= 0){if ((nCurMonth+nMonths)%12 != 0)nRetAcctMonth = (nCurYear+(nCurMonth+nMonths)/12)*100 + (nCurMonth+nMonths)%12;elsenRetAcctMonth = (nCurYear+(nCurMonth+nMonths)/12-1)*100 + 12;}else{int nYearOffset = 0;nCurYear = nCurYear + nMonths/12;nYearOffset = -nMonths/12;if (nCurMonth+nMonths%12 <= 0){nCurYear--;nYearOffset++;}nRetAcctMonth = nCurYear*100 + (nYearOffset*12+nCurMonth+nMonths);}return nRetAcctMonth;}void CGetTime::AddMonths(char *pszSourceDate,int iMonCount,char *pszDestDate){char szMonth[3] = "";char szYear[5] = "";char szDay[3] = "";char szSourceDay[3] = "";int iYear  = 0;int  iMonth = 0;int  iCount = 0;strncpy(szYear,pszSourceDate,4);szYear[4] = '\0';strncpy(szMonth,pszSourceDate + 4,2);szMonth[2] = '\0';strncpy(szSourceDay,pszSourceDate + 6,2);szSourceDay[2] = '\0';if (iMonCount > 0) {iMonth = atoi(szMonth) + iMonCount;iYear = atoi(szYear) + ((iMonth -1) / 12) ;iMonth = (iMonth -1) % 12 + 1;}else{iCount = (-1 * iMonCount) / 12 + 1;iMonth = iCount * 12 + atoi(szMonth) + iMonCount;iYear = atoi(szYear) + ((iMonth -1) / 12) - iCount ;iMonth = (iMonth -1) % 12 + 1;}sprintf(pszDestDate,"%d%02d",iYear,iMonth);}BOOL CGetTime::AddMonths(char* szDateTimeOffseted, size_t nSizeBuf, const char* szDateTime, int nMonths){if (nSizeBuf < 15){//printf("输出缓冲太小\n");return FALSE;}if (strlen(szDateTime) != 14){//printf("输入的时间日期格式非法\n");return FALSE;}char szTemp[50];memset(szTemp, 0x00, sizeof(szTemp));strncpy(szTemp, szDateTime, 6);int nMonth = atoi(szTemp);int nMonthOffseted = AddMonths(nMonth, nMonths);int nMonthNow = nMonthOffseted%100;int nYearNow = nMonthOffseted/100;memset(szTemp, 0x00, sizeof(szTemp));strncpy(szTemp, szDateTime+6, 2);int nDayNow = atoi(szTemp);if (nMonthNow == 2){if (nDayNow > 28){nDayNow = 28;if (nYearNow%4 == 0)nDayNow = 29;}}else{if (nDayNow > 30){if (nMonthNow == 4 ||nMonthNow == 6 ||nMonthNow == 9 ||nMonthNow == 11 )nDayNow = 30;}}sprintf(szDateTimeOffseted, "%d%02d%s", nMonthOffseted, nDayNow, szDateTime+8);return TRUE;//若要实现add_months(),其实还缺少对闰秒的考虑}//根据格式码取系统当前时间void CGetTime::GetCurTime(const char * szFormat,char * szCurTime,int nLen){struct tm tmNow;time_t timeNow;time(&timeNow);#ifdef WIN32tmNow = *localtime(&timeNow);#elselocaltime_r(&timeNow, &tmNow);#endifstrftime(szCurTime,nLen,szFormat,&tmNow);return;}//根据格式%Y%m%d %H:%M:%S.usec 取系统当前时间,到微秒级void CGetTime::GetCurTimeMicroSecond(char *pszSystemTime){if(pszSystemTime == NULL) return;//%Y%m%d %H:%M:%S.usec    time_t now;    struct tm tmNow;struct timeval tvNow;    gettimeofday(&tvNow,NULL);    now = tvNow.tv_sec;    tmNow = *localtime(&now);sprintf(pszSystemTime, "%04d%02d%02d %02d:%02d:%02d.%06ld", tmNow.tm_year+1900, tmNow.tm_mon+1, tmNow.tm_mday, tmNow.tm_hour, tmNow.tm_min, tmNow.tm_sec, tvNow.tv_usec);return;}// 取精确到微秒的系统时间'yyyymmddhh24miss.fff'void CGetTime::GetSystemMilliSecond(char *pszSystemTime){struct timeb system_time;ftime(&system_time);struct tm tmNow;#ifdef WIN32tmNow = *localtime(&system_time.time);#elselocaltime_r(&system_time.time, &tmNow);#endifsprintf(pszSystemTime, "%04d%02d%02d%02d%02d%02d.%03d", tmNow.tm_year+1900, tmNow.tm_mon+1, tmNow.tm_mday, tmNow.tm_hour, tmNow.tm_min, tmNow.tm_sec, system_time.millitm);return;}//计算月份差int32_t CGetTime::CalcOffsetMonth( char* pFirstMonth, char* pSecondMonth, DomainId &nOffset ){char szYear1[5], szYear2[5], szMonth1[3], szMonth2[3];memset( szYear1, 0x00, sizeof(szYear1) );memset( szYear2, 0x00, sizeof(szYear2) );memset( szMonth1, 0x00, sizeof(szMonth1) );memset( szMonth2, 0x00, sizeof(szMonth2) );strncpy( szYear1, pFirstMonth, 4 );strncpy( szMonth1, pFirstMonth+4, 2 );strncpy( szYear2, pSecondMonth, 4 );strncpy( szMonth2, pSecondMonth+4, 2 );nOffset = (atoi(szYear1) - atoi(szYear2))*12 +atoi(szMonth1) - atoi(szMonth2);return 0;}//  字符型时间反转成实际时间秒值time_t CGetTime::StringToTime(const char* szDateTime){char szBuf[5];struct tm cTm;memcpy(szBuf, szDateTime, 4);szBuf[4] = '\0';cTm.tm_year = atoi(szBuf) - 1900;    if (cTm.tm_year > 130)        cTm.tm_year = 130;else if (cTm.tm_year < 70)        cTm.tm_year = 70;memcpy(szBuf, szDateTime+4, 2);szBuf[2] = '\0';cTm.tm_mon = atoi(szBuf) - 1;if (cTm.tm_mon < 0)cTm.tm_mon = 0;memcpy(szBuf, szDateTime+6, 2);cTm.tm_mday = atoi(szBuf);memcpy(szBuf, szDateTime+8, 2);cTm.tm_hour = atoi(szBuf);memcpy(szBuf, szDateTime+10, 2);cTm.tm_min = atoi(szBuf);memcpy(szBuf, szDateTime+12, 2);cTm.tm_sec = atoi(szBuf);cTm.tm_isdst = -1;     time_t timeValue;while(true)    {        timeValue = mktime(&cTm);        if (timeValue >= 0)            return timeValue;        if (timeValue == -1 && errno == EINTR)        {            perror(szDateTime);            continue;        }        perror(szDateTime);                return timeValue;    }}//将数值型时间转换成字符串型void CGetTime::TimeToString(const time_t *pTime,char *szDateTime,const char* pSep1,const char* pSep2){struct tm pTm;#ifdef WIN32pTm = *localtime(pTime);#elselocaltime_r(pTime, &pTm);#endifConvertTmToString(pTm, szDateTime, pSep1, pSep2);}//开始计时,可以同时开始多个计时void CGetTime::BeginTime(int nCount){#ifndef WIN32if (nCount < MAX_TIMES_COUNT){gettimeofday(&m_Counts[nCount],0);m_nCount++;}#endif}//计时结束,返回秒long CGetTime::EndTime(int nCount){#ifndef WIN32struct timeval tpend;if (nCount < MAX_TIMES_COUNT){gettimeofday(&tpend,0);m_nCount--;return (tpend.tv_sec-m_Counts[nCount].tv_sec)+(tpend.tv_usec-m_Counts[nCount].tv_usec)/1000000;}return -1;#elsereturn 0;#endif}//计时结束,返回毫秒long CGetTime::EndTimeM(int nCount){#ifndef WIN32struct timeval tpend;if (nCount < MAX_TIMES_COUNT){gettimeofday(&tpend,0);return 1000*(tpend.tv_sec-m_Counts[nCount].tv_sec)+(tpend.tv_usec-m_Counts[nCount].tv_usec)/1000;}return -1;#elsereturn 0;#endif}//计时结束,返回秒数和速率long CGetTime::EndTimeRate(int nSum,double &fRate,int nCount){#ifdef WIN32long nRet = EndTimeM(nCount);if (nRet < 0)return -1;fRate = nSum*1000.0/nRet;return nRet/1000;#elsereturn 0;#endif}

 

#ifndef __GET_TIME_H__#define __GET_TIME_H__//#include <time.h>#include <sys/types.h>#include <sys/stat.h> #include "basic/Macro.h"#include "basic/BasicTypes.h"#include "basic/DomainType.h"#include "basic/Std.h"#ifndef WIN32#include <unistd.h>#include <sys/time.h>#endifnamespace lspublic{    namespace library    {        namespace util        {   /** * @brief 性能测试 add by gcm 20090611 *由于在HP机器上定义函数时会出现重复定义的问题, *所以需要增加static inline 避免出现重复定义的编译错误 * @paramstart[in]字符串长度 * @paramend[in]输入字符串 * @return开始时间至结束时间的时间差 */#ifdef WIN32typedef struct _timeb   CLOCKTIME;#define get_time(p)    _ftime(p)static inline int64_t diff_time (CLOCKTIME*  start, CLOCKTIME*  end){return ((end->time - start->time) * 1000 +(end->millitm - start->millitm));}#elsetypedef struct timeval  CLOCKTIME;#define get_time(p)    gettimeofday(p, NULL)//由于在HP机器上定义函数时会出现重复定义的问题,所以需要增加static inline 避免出现重复定义的编译错误static inline int64_t diff_time (CLOCKTIME*  start, CLOCKTIME*  end){return ((end->tv_sec - start->tv_sec) * 1000 +(end->tv_usec - start->tv_usec) / 1000);}//由于在HP机器上定义函数时会出现重复定义的问题,所以需要增加static inline 避免出现重复定义的编译错误static inline int64_t diff_time_microsecond (CLOCKTIME*  start, CLOCKTIME*  end){return ((end->tv_sec - start->tv_sec) * 1000 * 1000 +(end->tv_usec - start->tv_usec));}#endif#define MAX_TIMES_COUNT 10/** * @brief 时间方法类 */class CGetTime{public:/** * @brief IsValidTime *        判断时间是否合法 * @param szTime [in] 6位时间 HH24MISS * @return BOLL                 * @retval TRUE  成功 * @retval FALSE 失败 */static BOOL IsValidTime(const char* szTime);/** * @brief IsValidDate *        如果转换过程中保持不变,则为合法日期 * @param szDate [in] 8位日期 YYYYMMDD  * @return BOLL                 * @retval TRUE  成功 * @retval FALSE 失败 */static BOOL IsValidDate(const char* szDate);/** * @brief GetNowDateTime *        取得当前时间的字符串(YYYYMMDDHH24MISS) * @param szDateTime [out] 14位日期 YYYYMMDDHH24MISS  * @return void */static void GetNowDateTime(char* szDateTime);#ifndef WIN32    /** * @brief GetCurrentTime *        取当前时间 与GetNowDateTime相同,win下使用。 * @param szCurDate [out] 14位日期 YYYYMMDDHH24MISS  * @return void */static void GetCurrentTime(char *szCurDate);#endif/** * @brief GetWeekDay *        取得当前日期的星期(1-7) * @param szDate [in] 前8位日期 YYYYMMDD * @return int  * @retval 输入的日期是星期几 */static int GetWeekDay(const char* szDate);/** * @brief GetMonth *        取得当前月份 * @return int * @retval 返回当前月份 */static int GetMonth();/** * @brief GetMonth *        取得字符串日期中的月份 * @param  szDate [in] 前6位日期 YYYYMM * @return int * @retval 返回输入的日期中的月份 */static int GetMonth(const char* szDate);/** * @brief GetDay *        取得字符串日期中的天 * @param  szDate [in] 前8位日期 YYYYMMDD * @return int * @retval 返回输入的日期中的月份 */static int GetDay(const char* szDate);/** * @brief ConvertTmToString *        把tm结构的日期转换成字符串(YYYYMMDDHH24MISS)(可以按指明的分隔符) * @param  cTm[in]时间结构体 * @param  pSep1[in]日期间隔符,如果传入“-” 则日期格式:YYYY-MM-DD * @param  pSep2[in]时间间隔符,如果传入“:”则时间格式:HH24:MI:SS * @param  szDateTime[out]YYYYMMDDHH24MISS * @return void */static void ConvertTmToString(const struct tm cTm, char* szDateTime,const char* pSep1 = NULL,const char* pSep2=NULL);/** * @brief ConvertStringToTm *        把字符串的日期(YYYYMMDDHH24MISS)转换成tm结构 * @param  pdt[in]日期字符串 * @param  tm[out]tm结构体 * @return BOLL */static BOOL ConvertStringToTm(const char *pdt, struct tm *dt);/** * @brief TransHourFormat *        转换日期格式 YYYYMMDDHH24MISS TO YYYYMMDD HH24:MI:SS * @param  aszDateIn[in]日期字符串 * @param  aszDateOut[out]日期字符串 * @return void */static void TransHourFormat(char *aszDateIn, char *aszDateOut);/** * @brief TransTimeFormat *        转换日期格式 YYYYMMDD HH24:MI:SS to YYYYMMDDHH24MISS * @param  aszDateIn[in]日期字符串 * @param  anSize[in]按长度截取转化后的日期 * @param  aszDateOut[out]日期字符串 * @return int * @retval 0  成功 * @retval -1 失败 */static int TransTimeFormat(char *aszDateIn, char *aszDateOut, int anSize);/** * @brief ComputeDuration *        计算起始时间和结束时间之间的间隔(秒数) * @param  szBegTime[in]开始时间 YYYYMMDDHH24MISS * @param  szEndTime[in]结束时间 YYYYMMDDHH24MISS * @return int * @retval 返回时间间隔 */static int ComputeDuration(const char* szBegTime, const char* szEndTime);/** * @brief AddSecs *        增加秒数 * @param  aszDateIn[in]输入的时间 YYYYMMDDHH24MISS * @param  anSecs[in]增加的秒数 * @param  anSize[in]返回时间字符串截取 * @param  aszDateOut[out]返回增加后的时间 * @return int * @retval 0  成功 * @retval -1 失败 */static int AddSecs(const char * aszDateIn,int32_t anSecs,char * aszDateOut, int32_t anSize);/** * @brief AddDays *        增加天数 * @param  aszDateIn[in]输入的日期 YYYYMMDD * @param  anDays[in]增加的天数 * @param  anSize[in]返回日期字符串截取 * @param  aszDateOut[out]返回增加后的日期 * @return int * @retval 0  成功 * @retval -1 失败 */static int AddDays(const char * aszDateIn,int32_t anDays,char * aszDateOut, int32_t anSize);/** * @brief AddMonths *        增加月份 * @param  nAcctMonth[in]输入的月份 YYYYMM * @param  nMonths[in]增加的月数 * @return int * @retval 返回增加月数后的月份 */static int  AddMonths(int nAcctMonth, int nMonths);/** * @brief AddMonths *        增加月份   * @param  pszSourceDate[in]输入的日期 YYYYMMDDHH * @param  nMonths[in]增加的月数 * @param  pszDestDate[out]返回增加后月份 YYYYMM * @return void */static void AddMonths(char *pszSourceDate,int iMonCount,char *pszDestDate);/** * @brief AddMonths *        实现Oracle.add_months('yyyymmddhh24miss',n)的功能 * @param  szDateTimeOffseted[in]输入的时间 YYYYMMDDHH24MISS * @param  nSizeBuf[in]输出缓冲太小 * @param  nMonths[in]增加的月数 * @param  szDateTime[out]返回增加后时间 YYYYMMDDHH24MISS * @return BOLL */static BOOL AddMonths(char* szDateTimeOffseted, size_t nSizeBuf, const char* szDateTime, int nMonths);/** * @brief GetCurTime *        根据格式码取系统当前时间   * @param  szFormat[in]输入的格式,比如"Today is %A, day %d of %B in the year %Y." * @param  nLen[in]返回字符串的大小 * @param  szCurTime[out]返回日期 比如是"Today is Tuesday, day 29 of December in the year 2009" * @return void */static void GetCurTime(const char * szFormat,char * szCurTime,int nLen);/** * @brief GetCurTimeMicroSecond *        根据格式%Y%m%d %H:%M:%S.usec 取系统当前时间,到微秒级 * @param  pszSystemTime[out]返回日期 * @return void */static void GetCurTimeMicroSecond(char *pszSystemTime);/** * @brief GetSystemMilliSecond *        取精确到微秒的系统时间'yyyymmddhh24miss.fff' * @param  pszSystemTime[out]返回日期 * @return void */static void GetSystemMilliSecond(char *pszSystemTime);/** * @brief CalcOffsetMonth *        计算月份差 * @param  pFirstMonth[in]输入的起始时间 前六位YYYYMM * @param  pSecondMonth[in]输入的结束时间 前六位YYYYMM * @param  nOffset[out]月份差 * @return int32_t * @retval 0  成功  * @retval -1 失败 */static int32_t CalcOffsetMonth( char* pFirstMonth, char* pSecondMonth, int32_t &nOffset );/** * @brief StringToTime *        字符串转化为整形变量秒  * @param  szDateTime[in]YYYYMMDDHH24MiSS * @return time_t * @retval 返回计算得到的time_t值 */static time_t StringToTime(const char* szDateTime); /** * @brief TimeToString *        整形变量转化为字符串  * @param  lTime[in]time_t值 * @param  pSep1[in]日期间隔符 指定"-" 则日期格式 YYYY-MM-DD * @param  pSep2[in]时间间隔符 指定":" 则时间格式 HH:24:MiSS * @param  szDateTime[out]不指定间隔符YYYYMMDDHH24MiSS * @return void */static void TimeToString(const time_t *lTime,char *szDateTime,const char* pSep1 = NULL,const char* pSep2=NULL);/** * @brief 开始计时,可以同时开始多个计时 * * @paramnCount[in]计数器个数 * * @return void */static void BeginTime(int nCount = 0);/** * @brief 计时结束,返回秒 * * @paramnCount[in]计数器个数 * * @returnlong * @retval  正常返回秒, * @retval  0  如果没有记数器 * @retval  -1 函数出错返回 */static long EndTime(int nCount = 0);/** * @brief 计时结束,返回毫秒 * * @paramnCount[in]计数器个数 * * @returnlong * @retval  正常返回毫秒, * @retval  0  如果没有记数器 * @retval  -1 函数出错返回 */static long EndTimeM(int nCount = 0);/** * @brief  计时结束,返回秒数和速率 * * @paramnSum[in]长度 * @paramnCount[in]计数器个数 * @paramfRate[out]速率 * * @returnlong * @retval  正常返回秒, * @retval  0  如果没有记数器 * @retval  -1 函数出错返回 */static long EndTimeRate(int nSum,double &fRate,int nCount = 0);/** * @brief 计时器个数 *  * @returnint * @retval 当前使用的计时器个数 */static int GetCurrCount(){return m_nCount;};private:static struct timeval m_Counts[MAX_TIMES_COUNT]; //! 保存计时开始时间static int m_nCount;//! 当前使用的计时器个数};        }    }}#endif



 

原创粉丝点击