使用 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 个输入:datetime,因此您有 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();

 }