mysql數據庫0時區的時間搜索 java vue 前後端解決方案

前情版本提要
數據庫 mysql5.7
後端JAVA jdk10
前端 iview框架基於vue

之前開發遇到一個問題,就是我們的數據庫都是0時區,時間存入時,mysql會自動減去八小時,讀取數據時會自動加上八小時。這對於存儲和顯示是沒有問題的,但是搜索會有問題。因爲數據庫裏的日期對比需要string類型

如果有date類型直接對比的話請告知,因爲找到的答案都是在sql語句或者代碼裏最終轉換成string

舉個例子:

  • 前端存入的時間是“2018-12-19”,真正存入數據庫的時間是“2018-12-18 16:00:00”, 讀取出來不做任何處理是“2018-12-19 00:00:00”,然後後端返回可以format一下。

    到這裏爲止,雖然中間做了轉換,但是都是mysql數據庫自動做的,對我們來說影響不大,也看不見。
    然後就是查詢時間。

  • 前端傳入的時間是“2018-12-19”,後端做的處理是搜索“2018-12-19 00:00:00”“2018-12-19 23:59:59”的,按照正常邏輯來說應該展示之前新增的那條,但是因爲時區原因,數據庫裏的數據時間是“2018-12-18 16:00:00”,並不在時間範圍內,所以查詢不到數據。

出現這樣的問題之後我們就在思考解決方法。

  • 首先數據庫是0時區不會修改,因爲很多原因,在中途修改數據庫很不明智。
  • 其次從後端入手。那我的邏輯就應該是,拿到前端傳來的時間,轉換成Date,用DateUtilsDateFormatUtils工具對日期一次進行減八小和格式化成string的處理。不是不能做,但是項目裏有多處用到了時間搜索,而且剛開始接受的時間是字符串,中間要轉成Data進行處理,再轉換成字符串,覺得有點不合理。
  • 最後考慮從前端入手。是請教了公司前輩知道的帶時區的String叫做世界協調時間 (UTC)(就是這位前輩說讓我們用數據庫0時區,這樣符合規範=_=),然後使用的是類似2016-01-18T23:41:00 ,這個格式是符合 ISO-8601 標準的時間表示。在前端將用戶選擇的時間轉換成Date類型,然後用vue裏的封裝包裏的toISOString()方法。最後只用對時間處理一下,一步搞定。

this.startTime = change2Date(this.startTime).toISOString()

所以正真的sql查詢還是String,只是從前端傳來的就是帶時區格式的字符串,避免了後端繁複。以及讓前端傳來的時間精確到秒,讓用戶自己選擇。
如果以後可能的話,影響不大的話,建議mysql用八時區,避免諸多麻煩。

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