1. 程式人生 > 實用技巧 >mongodb中時間跟實際時間相差8小時----時區問題

mongodb中時間跟實際時間相差8小時----時區問題

遇到的問題

參考:mongo中時間跟實際時間相差8小時

Mongo中一個Collection有一個欄位用來存放資料的插入時間,但記錄的時間比實際時間晚了8小時。

查詢得知儲存在mongodb中的時間是標準時間UTC +0:00,而中國時區是+8.00,

請問有什麼辦法保證Collection中的插入時間和實際時間一致嗎?

GMT: 格林威治時間
UTC:標準時間
ISO: 標準時間
CST:北京時間
時間加Z:代表標準時間(一般和UTC時間一致)

enterDate: {
    type: Date,
    default: new Date()
} 

解決方法參考:

  • 應該要在應用層處理這個問題比較好,資料庫裡面都統一存 UTC 這樣才不會造成跨時區使用者插入資料的時間差異,多加一個 Timezone 欄位來克服。
  • 存 timestamp 也不錯.. 不過也是要依據時區轉

確定解決思路:

在應用層修改好資料,避免在資料庫中直接使用Date型別。

實際解決方案1:設定集合規則為字串格式

enterDate: {
    type: String,
    default: new Date().toString()
} 

實際解決方案2:設定集合規則為數字格式----儲存為時間戳(推薦使用方案2,這樣不同國家的人訪問時不會出現時區問題)

enterDate: {
    type: Number,
    default: Date.now
}

注意:通過頁面中新增學生資訊時,如果沒有填寫enterDate,它的值是 '' 一個空字串。

要在儲存資料前,手動修改它的值。

if (studentData.enterDate === '') {
    // studentData.enterDate = Date.now();
    studentData.enterDate = new Date().toString();
}

以上兩種方案任選其一

再在art-template解析中,使用monment第三方模組解析時間:

  1. 安裝第三方模組:npm install moment

  2. 引入monment第三方模組

    const moment = require('moment');
    // 匯入模板變數moment
    template.defaults.imports.moment = moment;
    
  3. 在模板中使用moment

    <td>{{ moment($value.enterDate).format('YYYY-MM-DD hh:mm:ss') }}</td>