时区变量的数据类型

时间:2016-09-20 10:14:21

标签: php mysql laravel

我将在他们的时区保存用户数据。

我应该使用varchardatetime或其他数据类型作为时间字段吗?为什么?

我在服务器端使用PHP。

3 个答案:

答案 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是默认值)。