如何更新Laravel Eloquent管理的时间戳(created_at和updated_at)的时区?

lar*_*000 8 php mysql timezone laravel eloquent

我在GMT中有一台服务器,但我想更新这些字段(*created_at*和*updated_at*)以保存PST中的时间戳.

我已经做了一些测试试图完成这个,但没有一个是正确的.

  • 我将config/application.php更新为'timezone'=>'America/Los_Angeles'
  • 此外,在服务器我已经改变date.timezonephp.ini中,以"美国/洛杉矶"

但是,任何此更新都会将时区更新应用于Laravel Eloquent时间戳.这个字段created_at和updated_at由Eloquent处理.

我还使用sudo dpkg-reconfigure tzdata更新了Ubuntu服务器时区,但此更新根本不起作用.

编辑:我需要将Laravel Eloquent时间戳用于PST时区,以便将期货插入数据库.

任何帮助都会有用.谢谢.

Jef*_*ert 15

我知道这个问题有点陈旧,但我在试图提出相同的解决方案时偶然发现它,并想分享我如何解决它.

我的建议是不要更改存储消息的时区.将它们作为UTC存储在数据库中.将存储设置保持为一个恒定的参照系,然后将其转换为您需要的任何时区,从长远来看,这将为您节省大量的麻烦.

作为其中一个令人头疼的例子,想象两个人试图在不同的时区协调会议时间,其中一个人观察DST而一个人没有,你需要在每个用户的当地时间显示时间.将存储的PDT时间转换为America/Cayman(不遵守DST)会有多难?当PST与PDT存储时间时,您会如何考虑?你怎么知道的?(提示:为了回答这个问题,可能没有数百行额外代码,你不会).

要在正确的时区中获得时间,只需在模型本身上添加一个mutator函数:

use Carbon\Carbon;

class MyModel extends Eloquent
{
    //  {{{ getCreatedAtAttribute()

    public function getCreatedAtAttribute($value)
    {
        return Carbon::createFromTimestamp(strtotime($value))
            ->timezone('America/Los_Angeles')
            ->toDateTimeString()
        ;
    }

    //  }}}
}
Run Code Online (Sandbox Code Playgroud)

现在,每当你这样做时$myModel->created_at,它将神奇地转换为正确的时区,但你仍然将UTC保留在你的数据库中,这肯定会超过其他时区的特权以进行持久存储.

想让用户设置自己的时区吗?将功能更改为:

public function getCreatedAtAttribute($value)
{
    $user = Auth::user();
    // If no user is logged in, we'll just default to the 
    // application's timezone
    $timezone = $user ? $user->timezone : Config::get('app.timezone');

    return Carbon::createFromTimestamp(strtotime($value))
        ->timezone($timezone)
        // Leave this part off if you want to keep the property as 
        // a Carbon object rather than always just returning a string
        ->toDateTimeString()
    ;
}
Run Code Online (Sandbox Code Playgroud)

而且,改变时区的所有复杂性,将日常储蓄考虑在内都会被抽象出来,你可以忘记它甚至必须发生.

有关Laravel mutators/accessors的更多信息,请查看文档.


ılǝ*_*ılǝ 3

我不确定我是否理解您是否想要更改服务器的设置以供将来的数据库条目使用,或者是否想要更新数据库中的当前值。

如果是后者,更改服务器设置不会影响数据库中的当前记录。如果您想更改现有字段的值,可以使用 MySQL 命令来执行此操作,例如:

 update `table` set created_at = (SELECT created_at) + INTERVAL 2 HOUR;
Run Code Online (Sandbox Code Playgroud)

其中table是数据库表的名称,2是以小时为单位的偏移量。