2016-06-13 2 views
2

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

Каждый пост должен быть опубликован в полночь в каждом часовом поясе. Мы сохранили данные о датах в формате 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); 
    } 

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

ответ

2

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

+0

Дополнительная информация и документация: http://carbon.nesbot.com/docs/ –

+0

Отлично. Это то, что мы ищем. Спасибо. Кроме того, когда мы пытаемся получить сегодняшнее сообщение, мы заменяем часть where() предложением whereBetween() как 'whereBetween ('published_at', array (Carbon :: now ($ data ['timezone']) -> format ('Ymd 00:00:00'), Carbon :: now ($ data ['timezone']) -> format ('Ymd H: i: s'))) '. Будет ли это работать? – IamGhale

+0

@IamGhale вы можете сократить его до 'whereBetween ('published_at', [Carbon :: now ($ data ['timezone']), Carbon :: tomorrow ($ data ['timezone'])])' –

Смежные вопросы