Yii2 并将数据作为 UTC 存储在数据库中

Yii2 and storing data in database as UTC

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

我注意到 $defaultTimezone which seems to indicate it simply controls what timezone your input data is supposed to be when passing it to functions such as the the asTime function and it uses the formatter timezone 将所述数据转换为正确的时间输出。

但我想知道您如何确保它在正确的时区将数据插入到您的数据库中,这样 $defaultTimezone 的值才可信?

MySQL是否需要运行这样的东西:

SET time_zone = timezonename;

如果您只想为您的应用程序使用一个时区,您只需将以下行添加到您的配置文件或入口脚本(默认为web/index.php):

date_default_timezone_set('UTC');

好的,这是我对此的发现:

时间戳:

MySQL 会自动将此值存储为 UTC 并根据 mysql 服务器时区将您提供的内容转换为 UTC 并返回。

但是,一些注意事项:

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

SET time_zone = 'UTC';

那么即使您在世界各地拥有服务器也没关系,您将始终在每台服务器上传回相同的数据 - 这将与您传递给它的数据相同,因此这将基于你的 PHP 时区,所以如果你想让它 传回 一个 UTC 时间,那么你应该使用 NOW() myswl 函数来存储时间戳。

如果您不设置服务器时区,MySQL 通常会依赖于 SYSTEM 时区,并且每个服务器会根据其时区获得不同的时间戳。

如果您想将 UTC 更改实施到 现有 系统,那么它的行为会有所不同。不管你传递什么,它似乎总是 return 日期为 UTC.

如果您将服务器时区设置为 UTC,然后将其更改为其他时区,那么事情就开始变得有些棘手了。

日期日期时间

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

存储 unix 时间戳:

如上所述,这些将只存储你给它们的任何值,因为你只是将它们存储为任何旧的 integer 但是 如果您想以 UTC 格式存储时间戳,那么您可以使用 UNIX_TIMESTAMP ,如@Ngô Văn Thao 所述,或者如果您需要在 PHP 中进行,则你可以这样做:

$tz = new DateTimeZone('UTC'); 
$dt = new DateTime("now", $tz);
$utc_timestamp = $dt->format('U');

U 表示 php 日期函数中的 unix 时间戳格式化选项;如果您想 return 其他格式的日期,您可以使用任何 formatting options

所以简而言之...

  • 使用 SET time_zone = 'UTC'
  • 将您的服务器时间设置为 UTC
  • 将数据插入 TIMESTAMP 个字段时使用 NOW()
  • 使用 UNIX_TIMESTAMP() 或上面提供的代码以 UTC
  • 存储您的 unix timestamps

执行上述操作应始终确保以 UTC 格式返回相关 times/dates。

我在这里找到了解决方案:https://gist.github.com/SilverFire/6f98d2605a6574bd02f7

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

在您的 "config/db.php" 中添加以下配置,但请记住将 'America/Manaus' 替换为您的 UTC:

return [

    // ... your database config goes here, and after:

    'on afterOpen' => function($event) {
        // $event->sender refers to the DB connection
        $event->sender->createCommand("SET time_zone = 'America/Manaus'")->execute();
    }
];