管理後臺關於時間的“補丁”

我們管理後臺的歷史

18年可以新做的項目,要求我們做管理後臺,但是我之前沒有前端的任何經驗,另外兩個小夥伴也沒有。只是用 Go 做過簡單的頁面。只接觸過一點點模板的東西,要做一個管理後臺,難度可想而知。
但是堅持了下來,19年後臺經過兩三次的框架重構,算是有模有樣了吧。

問題顯現

剛開始,我們只有國際版本的後臺,使用的是 UTC 時間,管理後臺上有很多關於活動時間的設置,之前並沒有任何關於時間的標準設計方式。所以後臺頁面傳入到後臺的時間格式有兩種,一種是時間格式字符串,例如 2020-05-20 20:00,另外一種是以時間戳的方式傳遞給後端

時間格式串

問題

  • 非 UTC 時區的服務器上,出現了異常【國服和日本服時間異常,因爲在解析時,我們使用的是 time.Parse 函數進行的處理,所以在對應的服務上會有異常】。

解決辦法

  • 在後臺使用 time.ParseInLocation 解析成本地服務器的正確時間

時間戳

問題

若服務器與本地時間不一致,則需要傳遞正確的時間戳到服務器。例如:最開始只有國際版,我們解決這個問題的辦法簡單又粗暴,直接將時間戳減去了 8 * 3600 秒。因爲我們的本地時間是 CST,這樣就能傳遞正確的時間戳到服務器了。但是隨着後續新增加的 國服和日本服分別採用了 CSTJST,前端就無法正常工作了。加之,服務器端只有兩個人了,維護三個版本,許多開發的功能需要同步,所以會異常痛苦。

解決辦法

幹掉傳遞時間戳的方式,直接傳遞時間格式字符串。 這樣前臺代碼就是統一的,對於設置者而言,永遠記得我設計的就是服務器的時間,這樣再也不用擔心合併過程中的“失誤”。

前臺展示問題

解決了前臺往後臺傳遞的問題,但是如何展示呢?

解決方案

  • 若不能通過後臺直接格式化時間,則顯式告訴前臺後臺使用的時區【因爲我們後臺,大部分傳遞到前臺的是時間戳,所以我們會將後臺所使用的時區傳遞到前臺】。
  • 直接由後臺根據時間戳轉換成時間格式傳遞出來。【依然有負作用,因爲前臺可能需要根據時間格式和當前的時間展示一些特殊的狀態,這樣前臺還是需要後臺的格式得到時間戳才能進行簡單的計算】

總結

  • 前臺傳遞給後臺使用時間格式字符串,最合理;
  • 前臺需要知道後臺的時區,後臺傳遞時間戳,前臺計算會比較簡單;

相關操作

修改 Linux 時區

CentOS7 和 Ubuntu 18.04 測試過

timedatectl set-timezone UTC # 設置本地時區爲 UTC
timedatectl set-timezone Asia/Tokyo # 設置爲日本標準時間 即東京
timedatectl set-timezone Asia/Shanghai # 設置爲中國標準時間 即上海

查看可用的時區

timedatectl list-timezones

我笑了

看到一個博客說:CST 應該是 “China Shanghai Time”,還好是應該。
其實計算機中應該有好多 ‘ST’,都是標準的意思。例如:stdio.h, unistd.h。
多看多學多遇到就不會搞這麼萌的笑話……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章