iT邦幫忙

0

Laravel model輸出時間與資料庫儲存時間不同

寫入資料庫的時間是我需要的台北標準時間,而使用Model輸出的時間卻仍然是格林威治時間。

route

Route::get('/test', function () {
    return App\Models\Post::all();
});

已嘗試
*為.env加上APP_TIMEZONE=Asia/Taipei

*config\app.php修改
'timezone' => 'UTC',

'timezone' => env('APP_TIMEZONE', 'UTC'),

*修改php8.1.ini
data.timezone=Asia/Taipei

*重新開機

等方式,仍然無法解決我的問題,想請問是否有人碰過類似的問題,該如何解決?

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

2
小魚
iT邦大師 1 級 ‧ 2022-08-04 07:53:50
最佳解答

時間本來就會被轉換,
這樣才不會有時差的問題,
只是要調整輸出的方式就好,
如果要輸出你要的時間可以在你的Model加入這個,

use DateTimeInterface;

protected function serializeDate(DateTimeInterface $date)
{
    return $date->format('Y-m-d H:i:s');
}

會轉換所有的DateTime(應該是Timestamp)物件.

看更多先前的回應...收起先前的回應...
ray_wu iT邦新手 5 級 ‧ 2022-08-04 09:46:33 檢舉

感謝您,嘗試過後已經成功了!

我現在倒是不在用 serializeDate 的方式了,改用宣告 cast 的方式處理了
畢竟不需要再多use個日期物件進來。

雖然後來我改成自已的CLASS操作就是了。

protected $casts = [
    'birthday' => 'date:Y-m-d',
    'joined_at' => 'datetime:Y-m-d H:00',
];
ray_wu iT邦新手 5 級 ‧ 2022-08-04 13:08:35 檢舉

哦!感謝分享!我晚點回家試試看!

ray_wu iT邦新手 5 級 ‧ 2022-08-04 13:37:08 檢舉

㊣浩瀚星空㊣
我嘗試使用了casts的方法,輸出的時間又會變回格林威治時間..

先清除緩存後再試試。
我不確定你改完ENV是否有重置緩存
那會有影響

ray_wu iT邦新手 5 級 ‧ 2022-08-04 16:04:22 檢舉

好的,感謝您!
我找到問題了,
因為我是使用Laradock環境,結果Laradock裡面env的環境有WORKSPACE_TIMEZONE=UTC,之前並沒有想到這裡會有時區設定,
剛剛突然想到我和大家不同的地方是我有使用Laradock的問題,
搜尋一下就看到有人分享Laradock遇到的坑,
於是將它改成WORKSPACE_TIMEZONE=Asia/Taipei就解決問題了。
現在運行的很好!
原本我已經快要放棄解決這個部分了,
因此還寫了一個js想說直接在前端解決這個問題。

var div = document.querySelectorAll('div')
for (var i = 1; i <= div.length; i++) {
    var index = '#time' + i.toString()
    var el = document.querySelector(index)
    var time = new Date(Date.parse(el.innerText)).toLocaleString({timeZone: 'Asia/Taipei'}, {hour12: false})
    el.innerText = `${time}`
}

感謝您的回應!

ray_wu iT邦新手 5 級 ‧ 2022-08-04 16:23:22 檢舉

不,我誤會了,事情仍然沒有解決..
就在我又新增了一筆資料之後

ray_wu iT邦新手 5 級 ‧ 2022-08-04 17:22:35 檢舉

不確定為什麼,但我改成以下這種方式就正常顯示了。
Route

Route::get('/test/{id}', function ($id) {
    $post = App\Models\Post::find($id);
    return view('testSingle', ['post' => $post]);
});

testSingle

<h1>{{$post->id}}</h1>
<h1>{{$post->content}}</h1>
<div id="time1">{{$post->created_at}}</div>
<div id="time2">{{$post->updated_at}}</div>

Route

Route::get('/test/all', function () {
    $post = App\Models\Post::all();
    return view('test',['post' => $post]);
});

test

@foreach ($post as $each)
    <h1>{{$each->id}}</h1>
    <h1>{{$each->content}}</h1>
    <div id="time1">{{$each->created_at}}</div>
    <div id="time2">{{$each->updated_at}}</div>
@endforeach

我要發表回答

立即登入回答