如何从数据库正确定义时区日期值

时间:2018-08-18 10:08:47

标签: php laravel datetime timezone php-carbon

我正在做一个待办事项应用程序,它需要某种方式来检查任务是否已经过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个小时,有关如何处理此问题的任何提示?

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

您可以使用上述查询在调整日期时操纵视图。