由于開發(fā)游戲服務(wù)器,常常會(huì)用到各種時(shí)間判斷。這里就在原有的標(biāo)準(zhǔn)C時(shí)間函數(shù)上做了一些擴(kuò)展,使他可以方便的用在游戲中。希望能對你有用:)
如果涉及到時(shí)候,請?jiān)诔绦騿?dòng)的時(shí)候,先運(yùn)行tzset()。這個(gè)函數(shù)會(huì)設(shè)置時(shí)間函數(shù)的全局變量timezone。下面有些函數(shù)用到了,請注意!
注意:C++Builder使用mktime,有bug!使用C++Builder的同志們要注意!(更新說明,函數(shù)有所調(diào)整,更新隨筆)
2016-3-14日更新
///取當(dāng)前服務(wù)器的UTC時(shí)間
inline second_time_t get_utc_time()
{
return second_time_t(time(NULL));
}
///取本地當(dāng)前時(shí)間
/**
utc時(shí)間扣除時(shí)區(qū)
*/
inline second_time_t get_local_now()
{
return get_utc_time() - timezone;
}
//取當(dāng)前最小為hour的時(shí)間 也就是分和秒為0的時(shí)間
inline second_time_t get_utc_hour_time()
{
second_time_t stNow = get_utc_time();
return stNow - stNow % SECONDS_PRE_HOUR;
}
//取指定時(shí)間小時(shí)時(shí)間 也就是分和秒為0的時(shí)間
inline second_time_t get_utc_hour_time(second_time_t paramTime)
{
return paramTime - paramTime % SECONDS_PRE_HOUR;
}
///取UTC時(shí)間對應(yīng)的本地時(shí)間時(shí)間結(jié)構(gòu)
/**
@param [in] paramUTCTime 指定的UTC時(shí)間
@param [out] paramResult 取得的時(shí)間結(jié)果
@return struct tm * 時(shí)間結(jié)果
*/
inline struct tm * get_localtime(second_time_t paramUTCTime, struct tm * paramResult)
{
time_t t = paramUTCTime;
*paramResult = *localtime(&t);
return paramResult;
}
///將utc時(shí)間,轉(zhuǎn)換成相應(yīng)的本地時(shí)間
/**
對應(yīng)的逆函數(shù)是 to_utc_time
@param [in] paramUTCTime UTC時(shí)間
@return second_time_t 對應(yīng)的本地時(shí)間
*/
inline second_time_t to_local_time(second_time_t paramUTCTime)
{
return paramUTCTime - timezone;
}
///生成時(shí)間
/**
參數(shù)是本地時(shí)間,返回的是UTC時(shí)間
@param [in] paramLocalTM 本地實(shí)際時(shí)間結(jié)構(gòu)
@return second_time_t 對應(yīng)的UTC時(shí)間
*/
inline second_time_t make_time(struct tm * paramLocalTM)
{
return second_time_t(mktime(paramLocalTM));
}
///將本地時(shí)間轉(zhuǎn)變成utc時(shí)間
/**
對應(yīng)的逆函數(shù)是 to_local_time
@param [in] paramLocalTime 本地時(shí)間
@return second_time_t 對應(yīng)的UTC時(shí)間
*/
inline second_time_t to_utc_time(second_time_t paramLocalTime)
{
return paramLocalTime + timezone;
}
///取本地時(shí)間對應(yīng)的時(shí)間結(jié)構(gòu)
/**
@param [in] paramLocalTime 指定的本地時(shí)間
@param [out] paramResult 取得的時(shí)間結(jié)果
@return struct tm * 時(shí)間結(jié)果
*/
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;
}
///判斷時(shí)間是不是同一天
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);
}
///取本周一零點(diǎn)時(shí)間
/**
@param [in] paramUTCTime 指定的utc時(shí)間
@return second_time_t 周一零點(diǎn)的utc時(shí)間
*/
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;
}
//判斷是不是同一個(gè)星期
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);
}
//計(jì)算相差的天數(shù)
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);
}
//計(jì)算是不是同一個(gè)月
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);
}
//取指定時(shí)間的0點(diǎn)時(shí)間
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 取指定時(shí)間的0點(diǎn)時(shí)間
inline second_time_t get_day_second()
{
auto utc = get_utc_time();
auto zt = get_zero_time(utc);
return utc - zt;
}
//取定本地時(shí)間 下一天0點(diǎn) 對應(yīng)的UTC時(shí)間
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);
}
//取定本地時(shí)間 下一周0點(diǎn) 對應(yīng)的UTC時(shí)間
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);
}
//取定本地時(shí)間 下一幾的0點(diǎn) 對應(yīng)的UTC時(shí)間
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);
}
//取指定本地時(shí)間 當(dāng)前月1號0點(diǎn) 對應(yīng)的UTC時(shí)間
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);
}
//取指定本地時(shí)間,下個(gè)月1號0點(diǎn) 對應(yīng)的UTC時(shí)間
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);
}