然而上述的那三個標準函數有一個大問題,就是它們會依賴主機使用的時區。又不想每次配合營運商變更時區的需求就調整一次主機使用的時區。最終想出了一個時區變換的方式,在這三個標準函數之外又實作了一層「可指定目標時區」的版本,即 mktime_utc() 和 localtime_utc()。使用時把希望運作的時區帶入即可求出相應該時區的結果。原始碼已上傳到 GitHub。
原理是這樣: 先用 time() 取得目前的 epoch seconds。把它分別丟給 gmtime() 與 localtime(),即可得到分別在 UTC+0、以及本地時區的日期表示結構。將兩個日期表示結構都丟給 mktime(),將其視為本地日期去反求對應的 epoch seconds,再將結果的差值記錄下來,此差值就是本地時間與 UTC+0 的秒數差 (有考慮日照節約時間)。知道了本地時間與 UTC+0 的秒數差、目標時區與 UTC+0 的秒數差也是已知的,那就完全可以由本地時間轉換到指定的目標時區了。
沒有留言:
張貼留言