To-Do Calendar - Day21 格式化返回的時間
原子習慣功能實作已告一段落,來補充一下關於格式化時間的字串。
時間欄位型態改用 Date 的緣由
開發到一半突然想到,在設計時間欄位時,好像沒仔細想過 MongoDB 資料型態的差異,就直接用 Long,因為之前做報表常有時間區間查詢、時間大小比較等需求,效能考量都用 Long,不過這次的專案並沒有這樣的需求,createdTime 欄位、lastModifiedTime 欄位也是給開發者自己看而已,而之前存 Long 的缺點就是無法直接閱讀,還必須透過工具轉換,於是決定將這兩個欄位(createdTime、lastModifiedTime)從 Long 改成 Date 型別試試!

時間戳(Timestamp)資料補充

使用 Long 時間欄位型別的 MongoDB 管理介面截圖

使用 Long 時間欄位型別的 API Tester 截圖
將程式中的 createdTime、lastModifiedTime 的型別都改成 Date 後,對 user02 的原子習慣點修改然後直接儲存後:

改用 Date 時間欄位型別的 MongoDB 管理介面截圖(java.util.Date 型別在 ORM 關係對映為 ISODate 型別)

改用 Date 時間欄位型別的 API Tester 截圖
這時顯示的時間出現了點問題,user02 的原子習慣是在 2022/6/10 下午1點多修改的,但 lastModifiedTime 顯示的時間卻是 2022/6/10 早上5點,整整早了8小時,這是因為 MongoDB 中的 Date 型態以 UTC(Coordinated Universal Time,世界標準時間)儲存,就等於 GMT(Greenwich Mean Time,格林威治標準時間,在不需要精確到秒的情況下,二者可以視為等同)。
Spring Boot 的 Date 型別預設是使用英國格林威治的時區來返回前端,而我所在的台灣時區,比 GMT 快8小時,如果想要將返回的時間調整成所在的時區,作法如下:
- 在 applocation.properties 加上時區設定(表示返回前端時要使用的時區)
spring.jackson.time-zone=GMT+8
- 也可以加上時間格式設定(這裡我選擇不加,保留時區資訊)
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss
- 設定完成後重新運行
運行結果

+08:00 表示前面的時間所屬的時區
這樣返回給前端的時間就會是我們設定的時區囉!