自动转换Mysql时区并在Laravel 5模型中再次返回

时间:2019-04-07 13:43:33

标签: laravel model timezone

我正在开发连接到2个数据库的Laravel 5.8应用程序。一个是应用程序自己的数据库,另一个是旧版MySQL数据库。遗憾的是,旧数据库将日期时间存储为“欧洲/伦敦”而不是UTC。

在Laravel模型中,是否有一种很好的方法可以自动将“欧洲/伦敦”日期调整为“ UTC”?

我已经看到您可以将'timezone'=>'+01:00'添加到'config / database.php'中的连接,但这没有影响。而且我不想在“ config / app.php”中设置应用程序的默认时区,因为这会影响应用程序自己的数据库,该数据库必须是UTC。

如果数据库包含'2019-04-01 13:00:00',我希望$model->created_at默认情况下返回'2019-04-01 12:00:00'(等效于UTC)。同样,如果我这样做,$model->created_at = '2019-04-01 12:00:00'; $model->save()应该在数据库中另存为'2019-04-01 13:00:00'。

有人可以帮忙吗?我开始认为我必须为所有datetime列创建一堆访问器和更改器,这似乎是很多工作。

1 个答案:

答案 0 :(得分:0)

最后,我使用了getAttribute和setAttribute

public function getAttribute($key){
        $value = parent::getAttribute($key);

        if(in_array($key, $this->dates)){
            $localDateTime = new \Carbon\Carbon(parent::asDateTime($value), 'Europe/London');
            $localDateTime->setTimezone('UTC');
            return $localDateTime;
        }
        else 
        {
            return $value;
        }
    }


    public function setAttribute($key, $value){
        if(in_array($key, $this->dates) && $value !== null){
            $value = new \Carbon\Carbon(parent::asDateTime($value), 'UTC');
            $value->setTimezone('Europe/London');
        }

        parent::setAttribute($key, $value);
    }

我将其放在BaseModel或trait中。另外,“欧洲/伦敦”将位于配置文件中。

似乎可以正常工作。真可惜,没有内置的方式(我知道)。