php - 时区变量的数据类型

标签 php mysql laravel

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

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

我正在服务器端使用 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/

相关文章:

php - 在 session 中存储 PHP 对象?

php - ssh2_exec() 不会用 "cd"改变目录

php - 文件修改时间的filectime vs filemtime?

python - 无法在 Virtualenv 中 pip 安装 MySQL-python

php - 使用 PHP/MySql 中的单个查询从多个表中获取 'related' 数据?

mysql - 多对多关系查询行吗?

javascript - 如何在登录表单上方显示错误的用户名和密码?

laravel - 无法找到可发布的资源

php - Laravel 中的用户关注系统

ubuntu - 抓取为 Google 'Unreachable' 错误