2019年7月20日 星期六

可自由指定時區的 mktime(), localtime()

現今手遊伺服器通常會在換日時處理一些遊戲內的事件。通常會是重置某些計數器、開啟或結束活動等等。隨著配合的營運商不同,常常會需要配合將換日線對齊指定時區的午夜。而這些時間上的操作,無外乎是透過 C/C++的標準函式庫中的 mktime(), gmtime(), localtime() 等等函數相互搭配組合來完成。


然而上述的那三個標準函數有一個大問題,就是它們會依賴主機使用的時區。又不想每次配合營運商變更時區的需求就調整一次主機使用的時區。最終想出了一個時區變換的方式,在這三個標準函數之外又實作了一層「可指定目標時區」的版本,即 mktime_utc() 和 localtime_utc()。使用時把希望運作的時區帶入即可求出相應該時區的結果。原始碼已上傳到 GitHub

原理是這樣: 先用 time() 取得目前的 epoch seconds。把它分別丟給 gmtime() 與 localtime(),即可得到分別在 UTC+0、以及本地時區的日期表示結構。將兩個日期表示結構都丟給 mktime(),將其視為本地日期去反求對應的 epoch seconds,再將結果的差值記錄下來,此差值就是本地時間與 UTC+0 的秒數差 (有考慮日照節約時間)。知道了本地時間與 UTC+0 的秒數差、目標時區與 UTC+0 的秒數差也是已知的,那就完全可以由本地時間轉換到指定的目標時區了。

沒有留言:

張貼留言