我将在他们的时区保存用户数据。
我应该使用varchar
,datetime
或其他数据类型作为时间字段吗?为什么?
我在服务器端使用PHP。
答案 0 :(得分:0)
您可以使用日期时间和时间戳。最好选择 datetime 数据类型,以便检索。
答案 1 :(得分:0)
始终尝试以毫秒为单位存储日期时间,以便您可以在特定时区进行转换。你可以使用varchar和string(在laravel中)来存储它。
答案 2 :(得分:0)
不要在数据库中存储带时区的日期。在UTC中的db存储(默认Laravel配置)中,当您的某些用户选择其他默认时区时,您将转换此基准日期。
用户模型应该有char字段" timezone"例如:'欧洲/伦敦'或者'欧洲/华沙'或者' 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
请记住,您可以通过覆盖Model 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;
}
每次要求 protected $ dates 属性中的模型中定义的datetime字段时,都会触发此方法(created_at,updated_at是默认值)。