我們管理後臺的歷史
18年可以新做的項目,要求我們做管理後臺,但是我之前沒有前端的任何經驗,另外兩個小夥伴也沒有。只是用 Go 做過簡單的頁面。只接觸過一點點模板的東西,要做一個管理後臺,難度可想而知。
但是堅持了下來,19年後臺經過兩三次的框架重構,算是有模有樣了吧。
問題顯現
剛開始,我們只有國際版本的後臺,使用的是 UTC 時間,管理後臺上有很多關於活動時間的設置,之前並沒有任何關於時間的標準設計方式。所以後臺頁面傳入到後臺的時間格式有兩種,一種是時間格式字符串,例如 2020-05-20 20:00,另外一種是以時間戳的方式傳遞給後端。
時間格式串
問題
- 非 UTC 時區的服務器上,出現了異常【國服和日本服時間異常,因爲在解析時,我們使用的是 time.Parse 函數進行的處理,所以在對應的服務上會有異常】。
解決辦法
- 在後臺使用 time.ParseInLocation 解析成本地服務器的正確時間
時間戳
問題
若服務器與本地時間不一致,則需要傳遞正確的時間戳到服務器。例如:最開始只有國際版,我們解決這個問題的辦法簡單又粗暴,直接將時間戳減去了 8 * 3600 秒。因爲我們的本地時間是 CST,這樣就能傳遞正確的時間戳到服務器了。但是隨着後續新增加的 國服和日本服分別採用了 CST 和 JST,前端就無法正常工作了。加之,服務器端只有兩個人了,維護三個版本,許多開發的功能需要同步,所以會異常痛苦。
解決辦法
幹掉傳遞時間戳的方式,直接傳遞時間格式字符串。 這樣前臺代碼就是統一的,對於設置者而言,永遠記得我設計的就是服務器的時間,這樣再也不用擔心合併過程中的“失誤”。
前臺展示問題
解決了前臺往後臺傳遞的問題,但是如何展示呢?
解決方案
- 若不能通過後臺直接格式化時間,則顯式告訴前臺後臺使用的時區【因爲我們後臺,大部分傳遞到前臺的是時間戳,所以我們會將後臺所使用的時區傳遞到前臺】。
- 直接由後臺根據時間戳轉換成時間格式傳遞出來。【依然有負作用,因爲前臺可能需要根據時間格式和當前的時間展示一些特殊的狀態,這樣前臺還是需要後臺的格式得到時間戳才能進行簡單的計算】
總結
- 前臺傳遞給後臺使用時間格式字符串,最合理;
- 前臺需要知道後臺的時區,後臺傳遞時間戳,前臺計算會比較簡單;
相關操作
修改 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。
多看多學多遇到就不會搞這麼萌的笑話……