由于开发游戏服务器,常常会用到各种时间判断。这里就在原有的标准C时间函数上做了一些扩展,使他可以方便的用在游戏中。希望能对你有用:)
// typedef int second_time_t; // 秒为单位的时间,如果位数不够,可以改成64位的
// typedef int second_time_t; // 秒为单位的时间,如果位数不够,可以改成64位的
//
const int SECONDS_PRE_DAY = 86400;
//
每天的秒数
/// 取当前服务器的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;
}
/// 取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 isSameDay(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_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);
}
/// 取当前服务器的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;
}
/// 取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 isSameDay(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_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);
}
Feedback