問題 - 時區沒有被保存
我的 MYSQL 資料庫中有一個日期時間列,名為starts_at. 當我嘗試使用時區(例如)保存 Carbon 日期時2021-12-31 13:00:00.0 UTC ( 00:00),記錄成功保存。
但是當我再次查詢記錄時,我看到時區沒有被保存。
相反,我看到"2021-12-31 13:00:00"UTC ( 00:00) 沒有保存。
我希望明確指出此列中的日期時間是 UTC。
代碼片段
這是正在發生的事情的一個例子:
// 1. Create a Carbon object that has a timezone of UTC
$first_of_jan_sydney = Carbon::create(2022, 1, 1, 0, 0, 0, 'Australia/Sydney');
$first_of_jan_sydney->setTimezone('UTC');
// => Carbon\Carbon @1640955600 {#4471
// date: 2021-12-31 13:00:00.0 UTC ( 00:00),
// }
// 2. Set the starts_at field to the Carbon object
$food_item_availability = FoodItemAvailability::first();
$food_item_availability->starts_at = $first_of_jan_sydney;
$food_item_availability->save();
// 3. When I requery the starts_at column, I see that the timezone (UTC) was not saved
FoodItemAvailability::first()->starts_at; // "2021-12-31 13:00:00"
移民
在創建表的遷移中,我使用了dateTimeTz例如
$table->dateTimeTz('starts_at')->nullable();
配置
在我的app.php,我已經設定了時區,例如
'timezone' => 'UTC',
在我的database.php,我已經設定了時區,例如
'mysql' => [
// ...
'timezone' => ' 00:00',
],
uj5u.com熱心網友回復:
dateTimeTz并且timestampTz是可悲的是不是所有的資料庫引擎支持,MySQL不為實體。所以你必須將它存盤在你身邊的 2 列中。
實際上,它可以幫助更好地控制應用程式端并避免依賴 DB 進行時區處理,這在 IMO 上更好。
我建議:
$table->dateTime('starts_at')->nullable();
$table->string('starts_at_timezone')->nullable();
在這里,我使用CarbonImmutable而不是Carbon這樣,原始物件上的時區不會被修改。您也可以使用->copy()但CarbonImmutable通常是處理日期的最安全方法:
$first_of_jan_sydney = CarbonImmutable::parse('2022-01-01 00:00 Australia/Sydney');
$food_item_availability = FoodItemAvailability::first();
$food_item_availability->starts_at_timezone = $first_of_jan_sydney->tzName;
$food_item_availability->starts_at = $first_of_jan_sydney->utc();
$food_item_availability->save();
// Reload later:
$item = FoodItemAvailability::first();
CarbonImmutable::parse($item->starts_at, 'UTC')->tz($item->starts_at_timezone);
PS:保持UTC和 00:00為全域設定,這部分沒問題。如果保留它,則CarbonImmutable::parse($item->starts_at)->tz($item->starts_at_timezone);無需明確指定'UTC'as timezone 引數即可使用。
uj5u.com熱心網友回復:
請在您的資料庫遷移表中使用它
$table->timestamp('starts_at')->useCurrent();
uj5u.com熱心網友回復:
Laravel 為我們提供了 dateTimeTz 來存盤帶時區的日期時間。請參閱下面的鏈接。
https://laravel.com/docs/8.x/migrations#column-method-dateTimeTz
我希望它能解決你的問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/399640.html
上一篇:資料庫相關概念
