专职C++

不能停止的脚步

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  156 Posts :: 7 Stories :: 135 Comments :: 0 Trackbacks

常用链接

留言簿(13)

我参与的团队

搜索

  •  

最新评论

阅读排行榜

评论排行榜

由于开发游戏服务器,常常会用到各种时间判断。这里就在原有的标准C时间函数上做了一些扩展,使他可以方便的用在游戏中。希望能对你有用:)
如果涉及到时候,请在程序启动的时候,先运行tzset()。这个函数会设置时间函数的全局变量timezone。下面有些函数用到了,请注意!
注意:C++Builder使用mktime,有bug!使用C++Builder的同志们要注意!
(更新说明,函数有所调整,更新随笔)
2016-3-14日更新

        ///取当前服务器的UTC时间
        inline second_time_t get_utc_time()
        {
            return second_time_t(time(NULL));
        }
        ///取本地当前时间
        /**
            utc时间扣除时区
         
*/
        inline second_time_t get_local_now()
        {
            return get_utc_time() - timezone;
        }
        //取当前最小为hour的时间 也就是分和秒为0的时间
        inline second_time_t get_utc_hour_time()
        {
            second_time_t stNow = get_utc_time();
            return stNow - stNow % SECONDS_PRE_HOUR;
        }
        //取指定时间小时时间 也就是分和秒为0的时间
        inline second_time_t get_utc_hour_time(second_time_t paramTime)
        {
            return paramTime - paramTime % SECONDS_PRE_HOUR;
        }
        ///取UTC时间对应的本地时间时间结构
        /**
            @param [in] paramUTCTime 指定的UTC时间
            @param [out]  paramResult 取得的时间结果
            @return struct tm * 时间结果
         
*/
        inline struct tm * get_localtime(second_time_t paramUTCTime, struct tm * paramResult)
        {
            time_t t = paramUTCTime;
            *paramResult = *localtime(&t);
            return paramResult;
        }
        ///将utc时间,转换成相应的本地时间
        /**
           对应的逆函数是 to_utc_time
           @param [in] paramUTCTime UTC时间
           @return second_time_t 对应的本地时间
         
*/
        inline second_time_t to_local_time(second_time_t paramUTCTime)
        {
            return paramUTCTime - timezone;
        }
        ///生成时间
        /**
            参数是本地时间,返回的是UTC时间
            @param [in] paramLocalTM 本地实际时间结构
            @return second_time_t 对应的UTC时间
         
*/
        inline second_time_t make_time(struct tm * paramLocalTM)
        {
            return second_time_t(mktime(paramLocalTM));
        }
        ///将本地时间转变成utc时间
        /**
            对应的逆函数是 to_local_time
            @param [in] paramLocalTime 本地时间
            @return second_time_t 对应的UTC时间
         
*/
        inline second_time_t to_utc_time(second_time_t paramLocalTime)
        {
            return paramLocalTime + timezone;
        }
        ///取本地时间对应的时间结构
        /**
            @param [in] paramLocalTime 指定的本地时间
            @param [out]  paramResult 取得的时间结果
            @return struct tm * 时间结果
         
*/
        inline struct tm * get_localtime_by_local(second_time_t paramLocalTime, struct tm * paramResult)
        {
            time_t t = to_utc_time(paramLocalTime);
            *paramResult = *localtime(&t);
            return paramResult;
        }

        ///判断时间是不是同一天
        inline bool is_same_day(second_time_t paramUTCT1, second_time_t paramUTCT2)
        {
            return (to_local_time(paramUTCT1) / SECONDS_PRE_DAY) == (to_local_time(paramUTCT2) / SECONDS_PRE_DAY);
        }
        ///取本周一零点时间
        /**
            @param [in] paramUTCTime 指定的utc时间
            @return second_time_t 周一零点的utc时间
         
*/
        inline second_time_t get_local_monday_zero_time(second_time_t paramUTCTime)
        {
            struct tm tNow;
            get_localtime(paramUTCTime, &tNow);

            int iWeekDay = tNow.tm_wday;
            if (iWeekDay == 0)  //如果是星期天
            {
                iWeekDay = 6;
            }
            else
            {
                iWeekDay --;
            }
            second_time_t stLocal = to_local_time(paramUTCTime);
            stLocal = stLocal - (stLocal % SECONDS_PRE_DAY) - iWeekDay * SECONDS_PRE_DAY;
            return to_utc_time(stLocal);
        }

        //是否是礼拜六和礼拜天
        inline bool is_weekend_day(second_time_t paramUTCTime)
        {
            second_time_t stMondayTime = get_local_monday_zero_time(paramUTCTime);
            return paramUTCTime >= stMondayTime + SECONDS_PRE_DAY * 5;
        }





        //判断是不是同一个星期
        inline bool is_same_week(second_time_t paramUTCTime1, second_time_t paramUTCTime2)
        {
            return get_local_monday_zero_time(paramUTCTime1) == get_local_monday_zero_time(paramUTCTime2);
        }

        //计算相差的天数
        inline int calc_diff_days(second_time_t paramUTCT1, second_time_t paramUTCT2)
        {
            return int(to_local_time(paramUTCT1) / SECONDS_PRE_DAY) - (to_local_time(paramUTCT2) / SECONDS_PRE_DAY);
        }
        //计算是不是同一个月
        inline bool is_same_month(second_time_t paramUTCT1, second_time_t paramUTCT2)
        {
            struct tm t1;
            struct tm t2;
            get_localtime(paramUTCT1, &t1);
            get_localtime(paramUTCT2, &t2);
            return (t1.tm_year == t2.tm_year) && (t1.tm_mon == t2.tm_mon);
        }
        //取指定时间的0点时间
        inline second_time_t get_zero_time(second_time_t paramUTC)
        {
             second_time_t stLocal = to_local_time(paramUTC);
             return to_utc_time(stLocal - (stLocal % SECONDS_PRE_DAY));
        }

        //cxy 取指定时间的0点时间
        inline second_time_t get_day_second()
        {
            auto utc = get_utc_time();
            auto zt = get_zero_time(utc);
            return utc - zt;
        }

        //取定本地时间 下一天0点 对应的UTC时间
        inline second_time_t get_next_day_zero_time(second_time_t paramUTC)
        {
            struct tm t;
            get_localtime(paramUTC, &t);
            t.tm_mday++;
            t.tm_hour = 0;
            t.tm_min = 0;
            t.tm_sec = 0;
            return make_time(&t);
        }

        //取定本地时间 下一周0点 对应的UTC时间
        inline second_time_t get_next_week_zero_time(second_time_t paramUTC)
        {
            struct tm t;
            get_localtime(paramUTC, &t);

            int day = 7 - t.tm_wday;
            t.tm_mday += day;
            t.tm_hour = 0;
            t.tm_min = 0;
            t.tm_sec = 0;
            return make_time(&t);
        }

        //取定本地时间 下一几的0点 对应的UTC时间
        inline second_time_t get_next_week_time(second_time_t paramUTC,int day)
        {
            struct tm t;
            get_localtime(paramUTC, &t);

            t.tm_hour = 0;
            t.tm_min = 0;
            t.tm_sec = 0;

            //同一天
            if (t.tm_wday == day)
                return get_next_week_time(paramUTC + SECONDS_PRE_DAY, 1);

            while (t.tm_wday != day)
            {
                t.tm_wday += 1;
                t.tm_wday %= 7;
                t.tm_mday += 1;
            }

            return make_time(&t);
        }

        //取指定本地时间 当前月1号0点 对应的UTC时间
        inline second_time_t get_month_1_day_zero_time(second_time_t paramUTC)
        {
            struct tm t;
            get_localtime(paramUTC, &t);
            t.tm_mday    = 1;
            t.tm_hour    = 0;
            t.tm_min    = 0;
            t.tm_sec    = 0;
            return make_time(&t);
        }
        //取指定本地时间,下个月1号0点 对应的UTC时间
        inline second_time_t get_next_month_1_day_zero_time(second_time_t paramUTC)
        {
            struct tm t;
            get_localtime(paramUTC, &t);
            t.tm_mon++;
            if (t.tm_mon > 11)
            {
                t.tm_year++;
                t.tm_mon = 0;
            }
            t.tm_mday = 1;
            t.tm_hour = 0;
            t.tm_min = 0;
            t.tm_sec = 0;
            return make_time(&t);
        }
posted on 2013-06-27 12:09 冬瓜 阅读(1947) 评论(1)  编辑 收藏 引用 所属分类: 原创linux

Feedback

# re: 一些常用的时间函数 2013-06-27 12:12 冬瓜
注意:C++Builder使用mktime,有bug!使用C++Builder的同志们要注意!  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理