Сделать фильтрацию данных местного часового пояса от UTC


У нас есть приложение в Laravel 5.2. В нашей базе данных published_at хранит дату в метке времени с экземпляром carbon в UTC, так же как created_at и updated_at.

Каждый пост должен быть опубликован в полночь в любом часовом поясе. Мы сохранили наши данные о датах в формате UTC, например
'published_at' => '2016-04-12 00:00:00'

То, что мы хотим сделать, похоже;

Если человек в нас смотрит его, то он/она видит этот пост после его / ее полуночного времени. Если человек в Китае смотрит его, то он/она видит этот пост после того, как его / ее полуночное время. Как мы можем этого достичь?

Это то, что мы делаем в данный момент. Но мы думаем, что это не сработает.

    public function all($limit, array $data = [])
    {
        $posts = $this->post->with('categories')
            ->where(
                'published_at', Carbon::now()->setTimezone($data['user_timezone'])
                                             ->format('Y-m-d 00:00:00')
            )
            ->orderBy('published_at', 'ASC')
            ->paginate($limit);
    }
Это первый раз, когда мы работаем в часовых поясах, и мы понятия не имеем. Любая помощь будет очень признательна. Спасибо.
1 2

1 ответ:

Похоже, что вы пытаетесь сделать "последовательную публикацию часового пояса", где в течение 24 часов где-то наступает полночь.

Предполагая, что вы захватили часовой пояс из ввода где-то (в $data?), вы можете использовать стандартное красноречивое / Laravel Query Builder verbiage для построения требуемого запроса:

Https://laravel.com/api/master/Illuminate/Database/Query/Builder.html

    public function all($limit, array $data = [])
    {
        $posts = $this->post->with('categories')
            ->where(
                'published_at',
                '<',
                Carbon::now($data['user_timezone'])
                    ->format('Y-m-d H:i:s')
            )
            ->orderBy('published_at', 'ASC')
            ->paginate($limit);
    }

Таким образом, как только "полночь" наступила в часовом поясе, являющемся пройдя через него, "published_at" будет иметь значение "меньше" текущей метки времени, включая ее в результаты.