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

У нас есть приложение в Laravel 5.2. В нашей базе данных publish_at хранит дату в отметке времени с экземпляром углерода в формате 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);
    }

Это первый раз, когда мы работаем в часовых поясах, и мы понятия не имеем. Любая помощь будет принята с благодарностью. Спасибо.


person IamGhale    schedule 13.06.2016    source источник


Ответы (1)


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

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

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" будет иметь значение «меньше, чем» текущая метка времени, включая ее в результаты.

person Justin Origin Broadband    schedule 13.06.2016
comment
Отлично. Это то, что мы ищем. Спасибо. Кроме того, когда мы пытаемся получить сегодняшнее сообщение, мы заменяем часть предложения where() предложением whereBetween(), например whereBetween( 'published_at', array( Carbon::now($data['timezone'])->format('Y-m-d 00:00:00'), Carbon::now($data['timezone'])->format('Y-m-d H:i:s') ) ) . Будет ли это работать? - person IamGhale; 14.06.2016
comment
@IamGhale, вы можете сократить его до whereBetween('published_at', [Carbon::now($data['timezone']),Carbon::tomorrow($data['timezone'])]) - person Justin Origin Broadband; 14.06.2016