Laravelのフォームで日時を扱うときの注意点と整形方法
生徒
「フォームで日付や時間を入力させたいのですが、注意することってありますか?」
先生
「あります。日時は保存形式や表示形式、タイムゾーンに注意する必要があります。」
生徒
「保存形式やタイムゾーンって難しそうですね…」
先生
「簡単に言うと、サーバーで管理する時間とユーザーに見せる時間がずれないように注意することです。」
1. フォームで日時を入力させる基本
HTMLフォームでは日付を入力する場合、type="date"やtype="datetime-local"を使うことができます。これにより、ユーザーはカレンダーから簡単に日付を選択できます。
<div class="form-group">
<label for="start_date">開始日</label>
<input type="date" id="start_date" name="start_date" class="form-control">
</div>
<div class="form-group">
<label for="start_time">開始時間</label>
<input type="time" id="start_time" name="start_time" class="form-control">
</div>
Laravelでは、送信された日付や時間は文字列として受け取るので、必要に応じて整形して保存します。
2. データベース保存時の注意点
Laravelで日付や時間をデータベースに保存する場合、datetime型やdate型を使います。保存する際には、Carbonクラスを使うと便利です。CarbonはPHPで日時を扱いやすくするライブラリです。
use Carbon\Carbon;
$startDate = Carbon::parse($request->start_date);
$startTime = Carbon::parse($request->start_time);
$model->start_datetime = $startDate->format('Y-m-d') . ' ' . $startTime->format('H:i:s');
$model->save();
ここでformat('Y-m-d H:i:s')とすることで、データベースのdatetime形式に合わせています。
3. タイムゾーンの注意
サーバーのタイムゾーンとユーザーのタイムゾーンが異なる場合、表示される時間がずれることがあります。Laravelではconfig/app.phpで'timezone'を設定できます。
'timezone' => 'Asia/Tokyo',
ユーザーごとにタイムゾーンを変えたい場合は、Carbonで変換して表示することも可能です。
$userTime = $startDate->copy()->timezone('America/New_York');
4. Bladeでの表示整形
保存された日時をフォームで再表示する場合、Bladeでvalue属性にCarbonを使って整形できます。
<input type="date" name="start_date"
value="{{ old('start_date', \Carbon\Carbon::parse($model->start_datetime)->format('Y-m-d')) }}"
class="form-control">
<input type="time" name="start_time"
value="{{ old('start_time', \Carbon\Carbon::parse($model->start_datetime)->format('H:i')) }}"
class="form-control">
こうすることで、編集画面でも正しい日付と時間が表示され、ユーザーが再入力する手間を省けます。
5. バリデーションのポイント
日付や時間を入力させる場合、Laravelのバリデーションルールを使って正しい形式か確認できます。
$request->validate([
'start_date' => 'required|date',
'start_time' => 'required|date_format:H:i',
]);
これにより、不正な日付や時間が送信されることを防げます。
6. 補足ポイント
- HTMLの
dateやtimeを使うとユーザー入力が簡単になる - Carbonを使って日時を整形し、データベース形式に合わせる
- タイムゾーンに注意して正しい時間を表示・保存する
- Bladeで再表示する場合もCarbonで整形してユーザー体験を向上
- バリデーションを設定して正しい形式を保証する