我已经做了一些尝试来完成这项测试,但没有一个是正确的.
>我将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.