2016-09-20 107 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中)来存储它。