我将把用户数据保存在他们的时区。
我应该使用 varchar
、datetime
或其他数据类型作为时间字段吗?为什么?
我正在服务器端使用 PHP。
最佳答案
不要在数据库中存储带有时区的日期。在 UTC(默认 Laravel 配置)的数据库存储中,当您的某些用户选择其他时区时,您将转换该基准日期。
用户模型应具有字符字段“时区”,其值例如:“欧洲/伦敦”或“欧洲/华沙”或“亚洲/符拉迪沃斯托克”。您可以在 camroncade/timezone package 中找到所有时区。接下来,当您在应用程序中显示日期时间时,您会将用户的时区附加到 Carbon 日期时间对象并转换为正确的时间。
$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;
}
每次您请求 protected $dates 属性中的模型中定义的日期时间字段时,都会触发此方法(默认为created_at、updated_at)。
关于php - 时区变量的数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39591437/