我正在做一个待办事项应用程序,它需要某种方式来检查任务是否已经过end_date。
问题::我将end_date存储在数据库中,但是每当我将此日期作为Carbon对象检索时,时区都定义为'UTC'
。我想将此时区设置为timezone('Europe/Brussels')
。如果我调整时区,则由于布鲁塞尔时区为UTC+2
,因此在end_date上将增加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'])}}
将日期添加到数据库:
$requestData = $request->all();
$task = new Task($requestData);
$task['end_date'] = $requestData['end_date'].= ' ' . $requestData['time'] .= ':00';
$task['user_id'] = auth()->id();
$task->save();
获取日期:
$task = Task::find(35);
dd($task->end_date);
// Result
Carbon @1534560960 {#550 ▼
date: 2018-08-18 02:56:00.0 UTC(+00:00)
}
$task = Task::find(35);
dd($task->end_date->timezone('Europe/Brussels'));
// Result
Carbon @1534560960 {#550 ▼
date: 2018-08-18 04:56:00.0 Europe/Brussels (+02:00)
}
要添加2个小时,有关如何处理此问题的任何提示?
答案 0 :(得分:2)
如果使用MySQL,则它不会在datetime字段中存储时区数据。因此,最好将所有日期时间值存储在UTC中,并在显示给用户时将其转换为所需的时区。
如果用户以欧洲/布鲁塞尔时区输入日期和时间,则应先将其转换为UTC,然后再存储在MySQL中,并在显示给用户时转换回欧洲/布鲁塞尔。
在将数据保存到DB的地方,可以使用以下代码:
$inputDateAndTime = $requestData['end_date'].' '.$requestData['time'].':00';
$task['end_date'] = Carbon\Carbon::createFromFormat('Y-m-d H:i:s', $inputDateAndTime, 'Europe/Brussels')->timezone('UTC');
最初,您在用户输入时区Europe / Brussels中创建datetime对象,然后立即将其转换为UTC。
答案 1 :(得分:0)
SET time_zone = "+00:00";//Adjust your Time Zone
您可以使用上述查询在调整日期时操纵视图。