Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 时区中间件不工作_Php_Laravel_Timezone_Middleware - Fatal编程技术网

Php 时区中间件不工作

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

我创建了一个中间件,以便根据数据库中设置的auth user时区设置时区:

<?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