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