Unix時間戳包含了豐富的時間信息,很多平臺都有時間戳的概念,也提供了不少操作時間戳的系統調用
這些系統調用固然強大,但我比較喜歡使用便捷的方法,而不是去調用系統函數,下面分享敲代碼時候碰到的兩個小例子,我使用了非常規的做法,使效率提高了那么一點點。
當代碼變簡單,變高效,哪怕只是一點點,心情都是非常舒暢的~~~
定義:是從1970年1月1日(UTC/GMT的午夜)開始所經過的秒數,不考慮閏秒。
Example1
需求,一個存儲在Memcached(可理解為數據庫)的結構體,結構主要內容如下,每個玩家每天可以獲得MAX經驗,exp字段表示今天得到的經驗,這個字段用于判斷是否達到當天的最高經驗
假設玩家要增加100經驗,exp+100超過MAX了,那么他要增加的經驗為 MAX-exp,在這之前要做一個判斷
先判斷是否今天第一次獲得經驗,如果是,設置當前的時間到time,然后exp設置為100
這時候一般做法可能是,把time和當前時間提取出來,獲取他們的年月日,來判斷是否同一天,如果不是同一天,把當前時間設置為time
struct xx{
int exp; //經驗
unsigned int time; //時間
};
我的做法是,獲取當前時間和time,但這個time我不會把時間戳存進去,而是計算之后的一個數值
一天的時間為60*60*24=86400
#define DAYTIME 86400
當前時間/DAYTIME 和 time做判斷,如果相等,表示同一天,如果不相等,把當前時間/DAYTIME 設置為time
兩種做法相比較,第一種需要調用兩次系統函數,來獲取tm,還有一次time系統調用,然后做3次判斷,年月日
第二種,只調用一次time系統調用,做一次除法和一次判斷,搞定
Example2
需求,在Memcached存一個數據,需要設置超時時間,每日凌晨過期,這樣的需求很廣泛,每日任務之類的都可以有這種需求
那么在設置這個key的時候,需要指定超時時間~,指定距離今日凌晨剩余的秒數。PS(當秒數為0的時候,需要設置為86400,不然0在memcached中的意思是,永不超時)
常規做法,通過系統函數獲取當日的時分秒,然后計算出當日逝去的秒數,最后86400-秒數,設置為超時時間
我的做法,
#define DAYTIME 86400
當前時間%DAYTIME 即可得到當日逝去的秒數,然后86400-當日逝去的秒數,設置為超時時間
兩種做法相比較,第一種需要額外調用一次系統函數,兩次乘法兩次加法 時*3600+分*60+秒得到當日逝去秒數
第二種,只做了一個取模操作,就得到了上面若干步驟得到的結果
如果你有其他高效的做法,歡迎分享,互相學習
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。