使用 Carbon 将时间字段添加到当前日期字段
Adding time field to the current date field using Carbon
问题: 我正在 Laravel 中制作某种待办事项应用程序,因此对于用户创建的每个待办事项,都会有一个给定的时间来自用户以指示何时必须完成此待办事项。现在我有 2 个输入字段,1 个用于日期,1 个用于特定时间。我想将时间输入添加到日期输入中,完成后我希望将其存储在数据库中
问题:如何将我的时间字段值添加到我的日期值?
代码:
输入字段:
{{Form::date('date', \Carbon\Carbon::today(),['class' => 'form-control mb-2 mr-sm-2 mb-sm-0'])}}
{{Form::time('time', \Carbon\Carbon::now()->timezone('Europe/Brussels')->format('H:i'),['class' => 'form-control'])}}
用户要添加任务时我的商店功能:
public function store(Request $request)
{
$this ->validate($request, ['title' => 'required|max:25','description' => 'required|max:60']);
$task = new Task;
$task -> title = $request->input('title');
$task -> description = $request->input('description');
$task -> end_date = $request->input('date');
$task -> user_id = auth()->id();
$task->save();
return redirect('/tasks')->with('success', 'Task created');
}
我的 Task.php 模型,我在其中尝试操纵 'end_date' 属性:
public function setEndDateAttribute($date)
{
$this->attributes['end_date'] = Carbon::createFromFormat('Y-m-d', $date);
}
我得到的结果:日期被添加到数据库中,但是通过上面的函数我得到了创建任务的日期+当前时间。我想用我输入的时间值
替换当前时间
您必须更改格式,
Carbon::createFromFormat('Y-m-d', $date);
只会得到您输入的年、月和日,但您还需要时、分(也许还有秒)。所以你必须像这样改变你的代码:
Carbon::createFromFormat('Y-m-d H:i:s', $date);
无论如何,如果您在模型中设置 $dates
属性,我认为对您来说更容易,请查看 official documentation:
/**
* The attributes that should be mutated to dates.
*
* @var array
*/
protected $dates = ['deleted_at'];
如果您将列添加到此数组,将自动返回一个 Carbon\Carbon
对象。
更新:
在您的表单中,您有 2 个输入:date
和 time
,因此您有 2 个选项:
- 就像我在评论中所说的那样,不要使用表单生成器
- 将这 2 个输入合并到一个 Carbon 对象中...
因此您的代码必须更改为:
$task -> end_date = $request->input('date');
至:
$task -> end_date = $request->input('date') . ' ' . $request->input('time');
并且您的增变器必须如上所述进行更改。
/**
* The attributes that should be mutated to dates.
*
* @var array
*/
protected $dates = ['end_date'];
// Check if a valide DateTime can be created
if ((bool)\DateTime::createFromFormat('d/m/Y H:i', $request->input('date') . ' '. $request->input('time') )) {
// Store it in database
$task -> end_date = Carbon::createFromFormat('d/m/Y H:i', $request->input('date') . ' '. $request->input('time'))->toDateTimeString();
}
问题: 我正在 Laravel 中制作某种待办事项应用程序,因此对于用户创建的每个待办事项,都会有一个给定的时间来自用户以指示何时必须完成此待办事项。现在我有 2 个输入字段,1 个用于日期,1 个用于特定时间。我想将时间输入添加到日期输入中,完成后我希望将其存储在数据库中
问题:如何将我的时间字段值添加到我的日期值?
代码:
输入字段:
{{Form::date('date', \Carbon\Carbon::today(),['class' => 'form-control mb-2 mr-sm-2 mb-sm-0'])}}
{{Form::time('time', \Carbon\Carbon::now()->timezone('Europe/Brussels')->format('H:i'),['class' => 'form-control'])}}
用户要添加任务时我的商店功能:
public function store(Request $request)
{
$this ->validate($request, ['title' => 'required|max:25','description' => 'required|max:60']);
$task = new Task;
$task -> title = $request->input('title');
$task -> description = $request->input('description');
$task -> end_date = $request->input('date');
$task -> user_id = auth()->id();
$task->save();
return redirect('/tasks')->with('success', 'Task created');
}
我的 Task.php 模型,我在其中尝试操纵 'end_date' 属性:
public function setEndDateAttribute($date)
{
$this->attributes['end_date'] = Carbon::createFromFormat('Y-m-d', $date);
}
我得到的结果:日期被添加到数据库中,但是通过上面的函数我得到了创建任务的日期+当前时间。我想用我输入的时间值
替换当前时间您必须更改格式,
Carbon::createFromFormat('Y-m-d', $date);
只会得到您输入的年、月和日,但您还需要时、分(也许还有秒)。所以你必须像这样改变你的代码:
Carbon::createFromFormat('Y-m-d H:i:s', $date);
无论如何,如果您在模型中设置 $dates
属性,我认为对您来说更容易,请查看 official documentation:
/**
* The attributes that should be mutated to dates.
*
* @var array
*/
protected $dates = ['deleted_at'];
如果您将列添加到此数组,将自动返回一个 Carbon\Carbon
对象。
更新:
在您的表单中,您有 2 个输入:date
和 time
,因此您有 2 个选项:
- 就像我在评论中所说的那样,不要使用表单生成器
- 将这 2 个输入合并到一个 Carbon 对象中...
因此您的代码必须更改为:
$task -> end_date = $request->input('date');
至:
$task -> end_date = $request->input('date') . ' ' . $request->input('time');
并且您的增变器必须如上所述进行更改。
/**
* The attributes that should be mutated to dates.
*
* @var array
*/
protected $dates = ['end_date'];
// Check if a valide DateTime can be created
if ((bool)\DateTime::createFromFormat('d/m/Y H:i', $request->input('date') . ' '. $request->input('time') )) {
// Store it in database
$task -> end_date = Carbon::createFromFormat('d/m/Y H:i', $request->input('date') . ' '. $request->input('time'))->toDateTimeString();
}