獲取指定時區的天數,小時數
阿新 • • 發佈:2018-12-30
給定一個當前時間對應的epoch,如何獲取北京時間(GMT+8)的天數
天數指的是從1970年1月1日0點開始數的天數
看上去很簡單,如果有epoch值t表示當前時間,直接用公式(t-0)/86400秒
說明:
1. 0表示1970年1月1日0點對應的秒數
2. 86400秒錶示一天的秒數,等於24(小時) * 3600(秒)
但是錯了。注意時區不一樣。epoch是UTC時區,而我們這裡是GMT+8時區。我們想要的天數是從GMT+8時區的1970年1月1日0點開始的天數。GMT+8時區的1970年1月1日0點比UTC時區的1970年1月1日0點早8小時,也就是秒數大8 * 3600 秒。
首先公式裡面用的都應該是GMT+8時區的值才準確。epoch代表UTC時區,加上8小時的秒數,就代表GMT+8時區的秒數。我們起個不正式的名字"local epoch", 代表相對於GMT+8時區的1970年1月1日0點開始的秒數。
local-epoch = epoch + 8 * 3600
這樣公式變為:
北京時間自1970年1月1日0點開始的天數 = local-epoch/86400
給定一個當前時間對應的epoch,如何獲取北京時間(GMT+8)的小時數
從上面的經驗來看,在GMT+8時區,所有數都應該轉換成對應的時區。
因此應該獲取local epoch,然後計算當天的小時數。
不過newlisp提供了函式(date-list),經過測試可以方便的使用。
下面先獲得GMT+8時區的時間字串"20160708 234913"對應的epoch, 然後獲得local epoch, 最後用date-list函式獲得小時,第4個元素:23
> (datetime-str-to-epoch "20160708 234913""%Y%m%d %H%M%S" (* 8 3600)) 1467992953 > (date-list (+ 1467992953 (* 8 3600))) (2016 7 8 23 49 13 190 5)
現在來驗證一下比較早的時間
> (datetime-str-to-epoch "20160708 004913""%Y%m%d %H%M%S" (* 8 3600))
1467910153
> (date-list (+ 1467910153 (* 8 3600)))
(2016 7 8 0 49 13 190 5)
0點也正確。
下面是完整的示例
#!/usr/bin/newlisp (setq epoch (date-value)) (setq time-offset (* 8 3600)) (setq cn-epoch (+ epoch time-offset)) (setq cn-day-index (/ cn-epoch 86400)) (setq cn-hour-index ((date-list cn-epoch) 3)) (println "epoch: " epoch) (println "time-offset: " time-offset) (println "cn-epoch: " cn-epoch) (println "cn-day-index: " cn-day-index) (println "cn-hour-index: " cn-hour-index) (exit)
結果輸出為:
epoch: 1479954759
time-offset: 28800
cn-epoch: 1479983559
cn-day-index: 17129
cn-hour-index: 10