2016-09-20 50 views
0

我將把用戶數據保存在他們的時區中。時區變量的數據類型

我應該在時間字段中使用varchar,datetime或其他數據類型,爲什麼?

我在服務器端使用PHP。

回答

0

不要在數據庫中存儲帶時區的日期。在UTC中的db存儲(默認Laravel配置)中,當您的某些用戶選擇其他默認時區時,您將轉換此基準日期。

用戶模型應該包含字段「timezone」,例如:'Europe/London'或'Europe/Warsaw'或'Asia/Vladivostok'。你可以在camroncade/timezone package找到所有時區。接下來,當您在應用程序中顯示日期時間時,您會將用戶的時區附加到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 

請記住,您可以通過在型號外徑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; 
    } 

這個方法將每個你會要求在模型中定義日期時間字段中保護$日期財產發射時間(created_at,的updated_at是默認值)。

+0

您好,我在$ value = new Carbon($ value)時出錯了;錯誤說DateTime :: __構造():無法解析時間字符串(1474430400)在位置8(0):意外的字符@Adiasz –

+0

即時通訊使用laravel 5.3 –

+0

1474430400 - 是日期時間戳,所以你必須創建對象的方式$ value = Carbon :: createFromTimestamp(1474430400);如果您有多種格式的日期,那麼您需要檢查是否在創建碳對象之前。看看文檔http://carbon.nesbot.com/docs/ – Adiasz

0

您可以使用datetime和時間戳。最好去datetime這是很好的檢索數據類型。

0

總是嘗試以毫秒爲單位存儲日期時間,以便您可以在特定的時區轉換該日期時間。你可以使用varchar和string(在laravel中)來存儲它。