0%

關於 Laravel model timestamp 時間錯誤問題

前言

當我們在使用 Laravel 的時候,有時候會遇到使用 model 取出資料後時間錯誤的問題,例如:
在資料庫中我有一筆資料是這樣的
他屬於 users 表,而他的 created_at2024/01/01 08:00:00,對應的 model 是 User
而在我使用 User::first() 可以取得這筆資料,但當我回傳給前端時發生了一件事情
前端取得資料時, created_at 的資料變成了 2024/01/01 00:00:00
而你發現你的 config/app.php 也有設定,但時間就不講理的提早了
究竟發生了什麼事導致這個原因
是不是 Laravel 有問題,還是有小精靈在搞鬼呢

儲存資料時發生的狀況

有沒有發現一件事情,我們儲存的時間是 2024/01/01 08:00:00,這代表甚麼,就只是個早上8點的時間
這其實對大多數情況適用,但如果要服務多國客戶就會變成,這個早上8點是系統當下時區的早上8點(先假設是台北時間UTC+8)

導致看到的資訊和實際的資訊有點落差,假設我人在日本,那這個時間實際上我來說應該要是 2024/01/01 09:00:00才對,那當我有服務多國客戶的需求的時候,我就變得要根據 request 的時區做更改,設計相當銀杏

為什麼要這樣做

實際上是因為部分的資料庫,例如: Mysql,他們的 Datetime 或是 Timestamp 型別,無法儲存時區
這樣一來,就不能辨認說,這個是來自於哪個國家的時間

所以再幫妳取出來的時候,就幫妳做了轉換,變成是 UTC0 的時區

關於時間比較好的做法

就像我上面說的狀況,當我有服務多國客戶的需求,比較好的方式是給從前端判定對方所在的時區去做運算,這樣比較能貼近使用者的真實狀況,而不是由後端去做運算。

參考資料

Laravel Date Casting, Serialization, & Timezones
toArray uses incorrect timezone.
Laravel Date Serialization
ISO8601

如果有錯誤的部份,歡迎指正,謝謝。
如果你喜歡這篇文章,請幫我拍手
只需要註冊會員就可以囉,完全不用花費任何一毛錢就可以用來鼓裡創作者囉