1. 程式人生 > >獲取指定時區的天數,小時數

獲取指定時區的天數,小時數

給定一個當前時間對應的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