【发布时间】:2018-08-18 15:30:48
【问题描述】:
我的数据库中的'end_date' 列有问题。首先,我正在制作一个待办事项应用程序。所以我有一个名为'Tasks' 的表,其中包含以下列:
$table->increments('id');
$table->integer('user_id');
$table->string('title');
$table->mediumText('description');
$table->timestamp('end_date');
$table->integer('completed');
$table->timestamps();
当用户创建一个任务时,他们可以给这个任务一个 end_date。我在 UTC+2 时区,所以对于用户来说,我一直以 UTC+2 显示时间,但我将它们以 UTC 格式存储在我的数据库中。
以下是具有实际存储功能的输入字段:
{{Form::date('end_date', \Carbon\Carbon::now()->timezone('Europe/Brussels'),['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'])}}
因为我使用了 2 个输入字段,所以我必须在 store 函数中将它们合并在一起:
public function store(Request $request)
{
$requestData = $request->all();
$task = new Task($requestData);
$inputDateAndTime = $requestData['end_date'].' '.$requestData['time'].':00';
$task['end_date'] = Carbon::createFromFormat('Y-m-d H:i:s', $inputDateAndTime, 'Europe/Brussels')->timezone('UTC');
$task['user_id'] = auth()->id();
$task['completed'] = 0;
$task->save();
return redirect('/tasks')->with('success', 'Task created');
}
在此函数中,我指定用户已在 UTC+2 时区给出时间,我希望将其转换为 UTC。 (这按预期工作)
问题:因此,如果用户希望完成此任务,他们可以执行 PUT 请求来更新 'completed' 列,但是在处理此请求时,我的 end_date 列正在更改同时完全不接触柱子。
我的更新功能:
public function update(Request $request, Task $task)
{
$task -> completed = 1;
$task->save();
return redirect('/tasks')->with('success', 'Task completed');
}
问题示例:
假设用户 1 创建了一个具有以下结束日期的任务 = 08/18/2018 20:14
请注意,这个时间是针对 UTC+2 的,所以我是说将其转换为 UTC。
在存储功能之后,我检查了数据库,如下 end_date = 2018-08-18 18:14:00
哪个是正确的,现在让我们看看我运行更新函数时的 end_date 是什么:
public function update(Request $request, Task $task)
{
dd($task->end_date);
// the result:
Carbon @1534616040 {#552 ▼ date: 2018-08-18 18:14:00.0 utc(+00:00)
}
}
所以仍然是相同的值,但是如果我正常运行更新功能并检查数据库,这就是我的值:
2018-08-18 17:24:27,我注意到我的 updated_at 字段具有相同的最后 2 位数字,所以它以某种方式占用了我假设的当前时间。我的 updated_at 字段:2018-08-18 15:24:27
知道我在这里做错了什么吗?
【问题讨论】:
-
记录更新时,时间戳会在db级别更新。使用日期时间等,这样您就可以真正只在需要时对其进行变异,而不是在您不希望的情况下由数据库控制。
-
所以我必须将迁移表更改为日期时间而不是时间戳?
-
是的,我认为应该可以解决问题
-
这对我有用,很有帮助!
-
我现在将其放在答案中,以便将来对其他人更有帮助。
标签: php mysql datetime laravel-5 php-carbon