Php Yii2,并以UTC格式在数据库中存储数据

Php Yii2,并以UTC格式在数据库中存储数据,php,mysql,yii,timezone,yii2,Php,Mysql,Yii,Timezone,Yii2,我正在使用Yii2,我想知道它是如何决定在数据库中存储数据的时区的 我注意到,它似乎表明它只是控制输入数据传递给函数(如函数)时的时区,并使用将所述数据转换为正确的时间输出 但我想知道如何确保它将数据插入到正确时区的数据库中,以便可以信任$defaultTimezone的值 对于MySQL,是否需要运行类似的程序: SET time_zone = timezonename; 如果希望应用程序只使用一个时区,则只需将以下行添加到配置文件或条目脚本(默认情况下为web/index.php): 如果

我正在使用
Yii2
,我想知道它是如何决定在数据库中存储数据的时区的

我注意到,它似乎表明它只是控制输入数据传递给函数(如函数)时的时区,并使用将所述数据转换为正确的时间输出

但我想知道如何确保它将数据插入到正确时区的数据库中,以便可以信任
$defaultTimezone
的值

对于
MySQL
,是否需要运行类似的程序:

SET time_zone = timezonename;

如果希望应用程序只使用一个时区,则只需将以下行添加到配置文件或条目脚本(默认情况下为web/index.php):


如果希望应用程序只使用一个时区,则只需将以下行添加到配置文件或条目脚本(默认情况下为web/index.php):


好的,以下是我在这方面的发现:

时间戳:

MySQL将自动将此值存储为
UTC
,并根据MySQL服务器时区将您提供的值转换为UTC和UTC

然而,有些人指出:

我建议您将服务器时区设置为
UTC
,如下所示:

SET time_zone = 'UTC';
$tz = new DateTimeZone('UTC'); 
$dt = new DateTime("now", $tz);
$utc_timestamp = $dt->format('U');
那么,如果你在世界各地都有服务器,你总是会在每台服务器上得到相同的数据,这将是你传递给它的相同数据,因此这将基于你的PHP时区,因此如果你想让它传回
UTC
时间,那么你应该使用
NOW()
myswl函数存储时间戳

如果不设置服务器时区,MySQL通常会依赖
系统
时区,并且每台服务器都会根据其时区返回不同的时间戳

如果您想在现有系统中实施
UTC
更改,则其行为将有所不同。无论您传递什么,它似乎总是将日期返回为
UTC

如果您将服务器时区设置为
UTC
,然后将其更改为其他时区,则此时事情开始变得有点棘手

日期日期时间

据我所知,这些只是存储并返回您提供给它们的确切数据

存储unix时间戳:

如上所述,这些将只存储您给它们的任何值,因为您只是将它们存储为任何旧的
整数
;但是,如果您想在UTC中存储时间戳,则可以使用@NgôVăn Thao所述的
UNIX_timestamp
,或者如果您需要在PHP中存储时间戳,则可以执行以下操作:

SET time_zone = 'UTC';
$tz = new DateTimeZone('UTC'); 
$dt = new DateTime("now", $tz);
$utc_timestamp = $dt->format('U');
U
表示php date函数中的unix时间戳格式选项;如果要以另一种格式返回日期,可以使用以下任意格式

总之

  • 使用
    设置时区='UTC'
  • 将数据插入
    TIMESTAMP
    字段时,请使用
    NOW()
  • 使用
    UNIX\u TIMESTAMP()
    或上面提供的代码以UTC格式存储
    UNIX时间戳

执行上述操作应始终确保以UTC格式返回相关时间/日期。

好的,以下是我在这方面的发现:

时间戳:

MySQL将自动将此值存储为
UTC
,并根据MySQL服务器时区将您提供的值转换为UTC和UTC

然而,有些人指出:

我建议您将服务器时区设置为
UTC
,如下所示:

SET time_zone = 'UTC';
$tz = new DateTimeZone('UTC'); 
$dt = new DateTime("now", $tz);
$utc_timestamp = $dt->format('U');
那么,如果你在世界各地都有服务器,你总是会在每台服务器上得到相同的数据,这将是你传递给它的相同数据,因此这将基于你的PHP时区,因此如果你想让它传回
UTC
时间,那么你应该使用
NOW()
myswl函数存储时间戳

如果不设置服务器时区,MySQL通常会依赖
系统
时区,并且每台服务器都会根据其时区返回不同的时间戳

如果您想在现有系统中实施
UTC
更改,则其行为将有所不同。无论您传递什么,它似乎总是将日期返回为
UTC

如果您将服务器时区设置为
UTC
,然后将其更改为其他时区,则此时事情开始变得有点棘手

日期日期时间

据我所知,这些只是存储并返回您提供给它们的确切数据

存储unix时间戳:

如上所述,这些将只存储您给它们的任何值,因为您只是将它们存储为任何旧的
整数
;但是,如果您想在UTC中存储时间戳,则可以使用@NgôVăn Thao所述的
UNIX_timestamp
,或者如果您需要在PHP中存储时间戳,则可以执行以下操作:

SET time_zone = 'UTC';
$tz = new DateTimeZone('UTC'); 
$dt = new DateTime("now", $tz);
$utc_timestamp = $dt->format('U');
U
表示php date函数中的unix时间戳格式选项;如果要以另一种格式返回日期,可以使用以下任意格式

总之

  • 使用
    设置时区='UTC'
  • 将数据插入
    TIMESTAMP
    字段时,请使用
    NOW()
  • 使用
    UNIX\u TIMESTAMP()
    或上面提供的代码以UTC格式存储
    UNIX时间戳
执行上述操作应始终确保以UTC格式返回相关时间/日期。

我在这里找到了一个解决方案:

它对我非常有效,特别是因为我在docker容器中使用mysql

在“config/db.php”中添加下面的配置,但记住替换“Am”