我创建了一个中间件,以便根据数据库中设置的auth用户时区设置时区:
<?php
namespace App\Http\Middleware;
use Closure;
class TimezoneMiddleware
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if ($request->user()->guest()) {
$timezone = config('app.timezone');
}
else {
$timezone = $request->user()->timezone;
}
date_default_timezone_set($timezone);
return $next($request);
}
}
我将此类添加到Kernel.php
中的全局HTTP中间件声明的底部。
问题在于它不起作用。显示created_at
字段时,无论我在数据库中设置用户时区,时间都保持不变。
答案 0 :(得分:0)
你的问题似乎是你想要正常的过滤器/系统中间件而不是路由中间件,所以如果你把你的中间件放在kernel.php文件的底部,那将无法工作。
在kernel.php中有不同的中间件,你应该在$middleware section and if your middleware is for routes to protect the routes then add into
routeMiddleware`中添加过滤器类型的中间件。
过滤类型的中间件,你的进入
protected $middleware = [
//.............
];
如果路由保护和过滤器中间件进入此
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
//..................
//.................
];
和时区
Config::set('app.timezone','custom time zone');
答案 1 :(得分:0)
您可以使用:
{{ $model->created_at->setTimezone( $timezone )->toDateTimeString() }}
但是,我认为必须有更好的选择。
答案 2 :(得分:0)
我高度推荐将您的日期保留在UTC数据库中 - 它会让您在以后的日常生活中感到头痛。
我建议使用Eloquent Mutators,即可 适用于您的模型。
这将使您仍然可以使用数据表,因为突变发生在从数据库中提取数据之后。
您可以在应用程序中创建一个可重用的类,该类具有用于解析日期的静态方法,例如:
<?php
namespace App;
use Carbon\Carbon;
class DateTimeZoneMutator
{
public static function mutate($value)
{
if (auth()->user()->guest()) {
$timezone = config('app.timezone');
}
else {
$timezone = auth()->user()->timezone;
}
return new Carbon(
$value, $timezone
);
}
}
然后在你的模型中,为了论证,我们假设你的日期字段被称为&#34; registered_at&#34;,你要添加以下方法:
<?php
namespace App;
use App\DateTimeZoneMutator;
use Illuminate\Database\Eloquent\Model;
class Something extends Model
{
// ...
public function getRegisteredAtAttribute($value)
{
return DateTimeZoneMutator::mutate($value);
}
// ...
}