2016-06-13 5 views
2

Laravel 5.2にはアプリケーションがあります。私たちのデータベースでは、published_atは、creation_atおよびupdated_atと同様に、UTCでのカーボンインスタンスのタイムスタンプに日付を格納します。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中):

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); 
    } 

あなたがどこかの入力からタイムゾーンをつかんできたと仮定すると、

、あなたが必要とクエリを構築するための標準的な雄弁/ Laravelクエリビルダの言い回しを使用することができますこうすることで、タイムゾーンが "真夜中"になるとすぐに、"published_at"の値は "結果のタイムスタンプ"を含む現在のタイムスタンプよりも小さくなります。

+0

詳細情報とドキュメント:http://carbon.nesbot.com/docs/ –

+0

それが私たちが探しているものです。ありがとうございました。また、今日の投稿を取得しようとしているとき、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']))' –

関連する問題