天天看點

openresty關于時區的處理

假如時間戳是86400,距離1970-01-01 00:00:00 過了一天

轉換關系如下

格林威治時間是1970-01-02 00:00:00 , 格林威治是0時區

中原標準時間是 1970-01-02 08:00:00 北京東8區,是以日期需要加8*3600秒顯示中原標準時間

紐約時間是 1970-01-01 20:00:00 紐約西5區,顯示日期需要減5*3600秒顯示紐約時間

紐約夏時令問題

本來北京比紐約早13個小時,我們早晨八點時他們還是昨天完成21點

但是紐約人節約能源,充分利用太陽光,約定每年3月第二個周日–11月第一個周日每天,都把時間調早一個小時,早點起床工作學習【這樣就和我們差了12個時區,成了西4區】, 其餘時間按标準的西5區。

如何在本時區計算其他時區的時間

一般系統函數處理時間,都自帶時區,比如

os.time()時間戳任何國家同一時刻結果都一樣,但是os.date函數會自動加上目前的時區

如果還是os.date, 伺服器時區設定的是東八區,那麼去紐約時間需要減去12小時(夏令時範圍内)

通過時間戳的修改,抵消os.date加上的時區

擷取其他時區的0點時間戳

為什麼要擷取其他時區的0點時間戳這個需求呢?

假如你從某天氣資料源擷取其他時區的天氣資料json格式的,對方給的是帶時區的日期格式 2022-09-18 05:00T-04:00(紐約市),

這個時間是當地時間5點的資料,後面标了時區西4區, 你需要判斷這個資料是否有效,如果你計算的對方的時間是 2022-09-18 09:00 , 都9點了,這個資料肯定沒用了,如何比較呢

當然知道和北京的時區差,可以用os.date 計算當地時間,和這個json時間比較

也可以計算當地時間所在天過去了多少秒, 然後求得當天0點的時間戳,再比較

北京當天過去了 (os.time() + 8 * 3600) % 86400 為X秒, 0點時間戳 os.time() - X

紐約當天過去了 (os.time() - 4 * 3600) % 86400 為Y秒, 0點時間戳 os.time() - Y

計算0點時間戳是因為判斷資料源的有效性是通過比較資料的日期是否大于當天0點的日期,大于的才需要保留,否則認為是過期的資料就舍棄。