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

前端之家收集整理的这篇文章主要介绍了php – 如何更新Laravel Eloquent管理的时间戳(created_at和updated_at)的时区?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在GMT中有一台服务器,但我想更新这些字段(* created_at *和* updated_at *)以保存PST中的时间戳.

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

>我将config / application.PHP更新为’timezone’=> “美国/洛杉矶”
>同样在服务器中我将PHP.ini中的date.timezone更改为’America / Los_Angeles’

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

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

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

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

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

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

作为其中一个令人头疼的例子,想象两个人试图在不同的时区协调会议时间,其中一个人观察DST而一个人没有,你需要在每个用户的当地时间显示时间.将存储的PDT时间转换成美国/开曼(不遵守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()
        ;
    }

    //  }}}
}

现在,每当你执行$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()
    ;
}

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

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

原文链接:https://www.f2er.com/laravel/135493.html

猜你在找的Laravel相关文章