2016-09-20 13 views
0

ユーザーのデータをタイムゾーンに保存します。タイムゾーン変数のデータ型

時間フィールドにvarchar,datetimeまたは別のデータ型を使用する必要があります。その理由は何ですか?

私はサーバー側でPHPを使用しています。

答えて

0

データベースにタイムゾーンを含む日付を格納しないでください。 UTC(デフォルトのLaravel設定)のdbストアでは、この基本日付は、あなたのユーザーの一部がデフォルトタイムゾーン以外を選択するときに変換します。

ユーザモデルには、「Europe/London」や「Europe/Warsaw」や「Asia/Vladivostok」などの値を持つcharフィールド「timezone」が必要です。すべてのタイムゾーンはcamroncade/timezone packageにあります。次にアプリケーションでdatetimeを表示すると、Carbonのdatetimeオブジェクトにユーザーのタイムゾーンが追加され、適切な時刻に変換されます。

$value // your base UTC datetime 
$value = new Carbon($value); 
$value->setTimezone(Auth:user()->timezone); 
print $value->format('Y-m-d H:i:s') // datetime in user's timezone 

あなたのモデルOD BaseModelにデフォルトのasDateTimeメソッドをオーバーライドすることで、日付のキャストを使用して変換プロセスを自動化することができますことに注意してください。

protected function asDateTime($value) 
    { 
     if($value instanceof Carbon) { 
      return $value; 
     } elseif($value instanceof \DateTime) { 
      $value = $value->format('Y-m-d H:i:s'); 
     } 

     $value = new Carbon($value); 

     if(Auth::user()) { 
      $value->setTimezone(Auth::user()->timezone); 
     } 

     return $value; 
    } 

この方法は、あなたが保護$日付プロパティ(デフォルトであるupdated_atののcreated_at、)でモデルに定義された日時フィールドを要求しますたびに起動されます。

+0

こんにちは、私は$ value = new Carbon($ value);でエラーが発生しました。エラーはDateTime :: __ construct():位置8(0)の時刻文字列(1474430400)を解析できませんでした:予期しない文字@Adiasz –

+0

im laravel 5.3 –

+0

1474430400 - あなたはそのようにオブジェクトを作成する必要があるので、値= Carbon :: createFromTimestamp(1474430400);複数の書式の日付がある場合は、Carbonオブジェクトを作成する前に確認する必要があります。 docs http://carbon.nesbot.com/docs/をご覧ください – Adiasz

0

datetimeとタイムスタンプの両方を使用できます。 datetimeの方が検索に適したデータ型になります。

0

datetimeをmilisecondで保存して、特定のタイムゾーンで変換できるようにしてください。そして、それを格納するためにvarcharとstring(laravelで)を使うことができます。