溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

巧用Unix時間戳

發布時間:2020-06-06 15:48:23 來源:網絡 閱讀:273 作者:wyb10a10 欄目:系統運維

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+秒得到當日逝去秒數

第二種,只做了一個取模操作,就得到了上面若干步驟得到的結果

 

如果你有其他高效的做法,歡迎分享,互相學習


向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女