⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wartime.cpp

📁 ftpserver very good sample
💻 CPP
字号:
#include "StdAfx.h"#include "WarTime.h"   // class implementedstatic int GetNumberFromStr(const char **p, int num);static int GetNumberFromStr (const char **p, int num){    int return_val = 0;    war_ccstr_t pp = *p;    *p += num;    for (; num > 0; num--, pp++)    {        return_val *= 10;        return_val += (*pp + '0');    }    return return_val;}/////////////////////////////// PUBLIC ///////////////////////////////////////#define NS100_TO_MS 10000#ifdef WIN32#   define FILETIME_OFFSET 0x019db1ded53e8000 // Offset from FILETIME 0 to 1.1. 1970#endif bool WarTime::mgOptimized;war_time_t WarTime::mgCurrentTime;//============================= LIFECYCLE ====================================WarTime::WarTime(){    Reset();}// WarTimeWarTime::WarTime(const WarTime& val){    mTime = val.mTime;}// WarTimeWarTime::~WarTime(){}// ~WarTimeWarTime::WarTime(const time_t val){    operator = (val);}WarTime::WarTime(const timeval& val){    operator = (val);}WarTime::WarTime(const war_time_t& val){    operator = (val);}WarTime::WarTime(const struct tm& val){    operator = (val);}#ifdef WIN32WarTime::WarTime (const FILETIME& val){    operator = (val);}WarTime::WarTime (const SYSTEMTIME& val){    operator = (val);}#endif // WIN32//============================= OPERATORS ====================================WarTime& WarTime::operator = (const WarTime& val){    mTime = val.mTime;    return *this;}WarTime& WarTime::operator = (const time_t val){    mTime = ((war_time_t)val) * 1000;    return *this;}WarTime& WarTime::operator = (const timeval val){    mTime = ((war_time_t)val.tv_sec) * 1000;    mTime -= val.tv_usec / 100; // We want milliseconds, not microseconds    return *this;}WarTime& WarTime::operator = (const war_time_t val){    mTime = val;    return *this;};WarTime& WarTime::operator = (const struct tm& rVal){    operator = (mktime((struct tm *) &rVal));    // mktime() assumes that tm is localtime. We work in UTC, and    // need to convert from localtime.    ToUTC();    return *this;}#ifdef WIN32WarTime& WarTime::operator = (const FILETIME& rVal){    war_time_t time_val;    time_val = (war_time_t) rVal.dwLowDateTime;    time_val |= ((war_time_t) rVal.dwHighDateTime << 32) & 0xffffffff00000000;    mTime = (time_val - FILETIME_OFFSET) / NS100_TO_MS;    return *this;}WarTime& WarTime::operator = (const SYSTEMTIME& rVal){    FILETIME ft_value;    if (!SystemTimeToFileTime(&rVal, &ft_value))        Reset();    else        operator = (ft_value);    return *this;}#endif // WIN32//============================= OPERATIONS ===================================void WarTime::ToLT(){    mTime += (GetUtcOffset() * 1000);}void WarTime::ToUTC(){    mTime -= (GetUtcOffset() * 1000);}void WarTime::Reset(const war_uint32_t millisecondTimeout){    mTime = WarGetCurrentTime();    if (millisecondTimeout)        mTime += millisecondTimeout;}void WarTime::Clear(){    mTime = 0;}void WarTime::Sleep(const war_uint32_t milliseconds){#ifdef WIN32    ::Sleep(milliseconds);#else    struct timeval tv;    tv.tv_sec = milliseconds / 1000;    tv.tv_usec = (milliseconds - (tv.tv_sec * 1000)) * 100;    select(0, NULL, NULL, NULL, &tv);#endif}//============================= ACESS      ===================================void WarTime::ScanMDTM(war_ccstr_t time_str) throw(WarException){    war_ccstr_t p = time_str;    for (int i = 0; i < 12; i++)    {        if (!isdigit (*p++))        {            WarThrow(WarError(WAR_ERR_INVALID_ARGUMENT), time_str);        }       }    p = time_str;        struct tm tm_val;    memset (&tm_val, 0, sizeof (struct tm));    tm_val.tm_year = GetNumberFromStr(&p, 4);    tm_val.tm_mday = GetNumberFromStr(&p, 2);    tm_val.tm_hour = GetNumberFromStr(&p, 2);    tm_val.tm_min = GetNumberFromStr(&p, 2);    tm_val.tm_sec = GetNumberFromStr(&p, 2);        operator = (tm_val);        if (*p && *++p)        mTime += atoi (p);}//============================= INQUIRY    ===================================time_t WarTime::GetTime() const{    return (time_t)(mTime / 1000);}timeval WarTime::GetTimeval() const{    timeval tv;    tv.tv_sec = (long) (mTime / 1000);    tv.tv_usec = (long) (mTime -         ((war_time_t) tv.tv_sec * 1000)) * 100;        return tv;}struct tm WarTime::GetTm() const throw(WarException){    struct tm tm, *ptm;    const time_t tval(GetTime());        ptm = ::gmtime(&tval);    if (ptm)        tm = *ptm;    else    {        WarThrow(WarError(WAR_ERR_SYSTEM_CALL_FAILED), "gmtime()");    }        return tm;}#ifdef WIN32FILETIME WarTime::GetFiletime() const{    FILETIME ft;    war_time_t mt = mTime;        mt *= NS100_TO_MS;    mt += FILETIME_OFFSET;        ft.dwLowDateTime = (war_uint32_t) (mt & 0xffffffff);    ft.dwHighDateTime = (war_uint32_t) ((mt >> 32) & 0xffffffff);        return ft;}SYSTEMTIME WarTime::GetSystemtime() const{    FILETIME ft = GetFiletime();    SYSTEMTIME st;        FileTimeToSystemTime (&ft, &st);        return st;}#endiftime_t WarTime::GetUtcOffset(){    time_t tt = ::time(NULL);    struct tm gmt, *t;    int days, hours, minutes;        gmt = *::gmtime(&tt);    t = ::localtime(&tt);    days = t->tm_yday - gmt.tm_yday;    hours = ((days < -1 ? 24 : 1 < days ? -24 : days * 24)        + t->tm_hour - gmt.tm_hour);    minutes = hours * 60 + t->tm_min - gmt.tm_min;    return minutes * 60;}war_time_t WarTime::WarGetCurrentTime(const bool doForce){    if (!doForce && mgOptimized)        return mgCurrentTime;    war_time_t return_val;#ifdef WIN32    SYSTEMTIME st;    ::GetSystemTime(&st);    return_val = (war_time_t) time (NULL) * (war_time_t) 1000;    return_val += st.wMilliseconds;#elif defined(HAVE_GETTIMEOFDAY)    struct timeval tv;    gettimeofday(&tv, NULL);    return_val = (war_time_t) tv.tv_sec * (war_time_t) 1000;    return_val += (war_time_t) (tv.tv_usec / 100);#else#error "Not handled"#endif    return mgCurrentTime = return_val;}const bool WarTime::IsTimeOut(const war_time_t milliseconds) const{    return GetTimeDiff() <= milliseconds;}const war_time_t WarTime::GetTimeDiff(const war_time_t milliseconds) const{    return mTime - (WarGetCurrentTime() + milliseconds);}std::string WarTime::FormatMDTM(const size_t precision) const throw(WarException){    char buf[36];    time_t tt = GetTime();    struct tm tm_value = GetTm();    char *pos = buf + sprintf(buf, "%04d%02d%02d%02d%02d",             tm_value.tm_year,             tm_value.tm_mday,             tm_value.tm_hour,             tm_value.tm_min,             tm_value.tm_sec);    switch(precision)    {    case 1000:        {            WarTime TmpTime = tt;            sprintf(pos, ".%03d", (unsigned)(mTime - TmpTime.mTime));        }        break;    default:        ; // Nothing        break;    }    return buf;}/** Format local time */const std::string WarTime::FormatLT(war_ccstr_t Fmt) const throw(WarException){    char buf[1024];        time_t tt = GetTime();    struct tm *ptm = localtime(&tt);    if (NULL == ptm)        WarThrow(WarError(WAR_ERR_SYSTEM_CALL_FAILED), "localtime()");        strftime (buf, sizeof (buf), Fmt, ptm);        return std::string(buf);}/** Format GMT time */const std::string WarTime::FormatGMT(war_ccstr_t Fmt) const throw(WarException){    char buf[1024];        time_t tt = GetTime();    struct tm *ptm = gmtime(&tt);    if (NULL == ptm)        WarThrow(WarError(WAR_ERR_SYSTEM_CALL_FAILED), "gmtime()");        strftime (buf, sizeof (buf), Fmt, ptm);        return std::string(buf);}/////////////////////////////// PROTECTED  ////////////////////////////////////////////////////////////////// PRIVATE    ///////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -