Php 时区中间件不工作
我创建了一个中间件,以便根据数据库中设置的auth user时区设置时区:Php 时区中间件不工作,php,laravel,timezone,middleware,Php,Laravel,Timezone,Middleware,我创建了一个中间件,以便根据数据库中设置的auth user时区设置时区: <?php namespace App\Http\Middleware; use Closure; class TimezoneMiddleware { /** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $nex
<?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文件的底部,那么将无法工作
kernel.php中有不同的中间件,您应该在$middleware部分添加过滤器类型的中间件,如果您的中间件用于保护路由,则添加到routemddleware`
过滤器类型的中间件,就像您的一样进入这个
protected $middleware = [
//.............
];
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
//..................
//.................
];
如果路由保护和过滤中间件进入这个
protected $middleware = [
//.............
];
protected $routeMiddleware = [
'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
//..................
//.................
];
时区呢
Config::set('app.timezone','custom time zone');
您可以使用类似于:
{{ $model->created_at->setTimezone( $timezone )->toDateTimeString() }}
但是,我相信一定有更好的选择。我强烈建议您将日期保留在UTC的数据库中,这将为您以后的工作省去麻烦
我的建议是使用
应用于您的模型
这将使您能够继续使用数据表,因为变异发生在数据从数据库中取出之后
您也许可以在应用程序中创建一个可重用类,该类具有用于解析日期的静态方法,例如:
<?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
);
}
}
数据库中的所有日期和时间都存储在UTC中。除非您执行某种转换,否则您将从数据库查询中得到该转换。我只希望从数据库中获取的任何时间戳
使用用户指定的时区。我尝试过中间件、服务提供商,但都不管用。我迷路了。我使用的是datatables,所以我希望它能够自动完成。您可能需要阅读此内容记住date\u default\u timezone\u set()
仅影响PHP日期和时间函数的功能!!!我的问题实际上是关于如何在每次查询中使用Elount自动执行此操作。我已经将该类放入全局HTTP$middleware
声明中,就像我在OP中所说的那样。您是否尝试使用Config::set('app.timezone','custom timezone')设置时区代码>代替日期默认时区设置($timezone)代码>为什么不让时区保持原样,在显示日期和时间时,您是否查看了Carbon
class“配置时区设置为UTC,这是应用程序在将时间戳插入数据库时需要使用的。”只要您在数据库中使用正确的时间戳
字段(不是DATETIME
),无论配置值是什么,Laravel都将始终存储为UTC。Laravel使用应用程序时区来确定要插入数据库的时间戳。请参阅illumb\Foundation\Bootstrap\LoadConfiguration
。