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

时间:2015-08-28 16:16:45

标签: php mysql yii timezone yii2

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

我注意到$defaultTimezone似乎表明它只是控制输入数据在将其传递给asTime函数等函数时应该是什么时区它使用formatter timezone将所述数据转换为正确的时间输出。

但是我想知道如何确保它在正确的时区将数据插入数据库,那么$defaultTimezone的值是否可以信任?

是否需要为MySQL运行类似的内容:

SET time_zone = timezonename;

2 个答案:

答案 0 :(得分:0)

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

date_default_timezone_set('UTC');

答案 1 :(得分:0)

好的,这是我发现的关于此的内容:

<强>时间戳:

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

然而,有些注意事项:

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

SET time_zone = 'UTC';

然后,如果您在世界各地拥有服务器,那么您将始终获得在每台服务器上传回的相同数据并不重要 - 这将与您传递给它的数据相同,因此这将基于您的PHP timezone,所以如果你希望传回一个UTC时间,那么你应该使用NOW() myswl函数来存储TIMESTAMP。

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

如果您要对现有系统实施UTC更改,那么它的行为会有所不同。无论你传递什么,它似乎总是将日期返回UTC

如果您将服务器时区设置为UTC,然后将其更改为其他内容,那么当事情开始变得有点毛茸茸时。

日期日期时间

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

存储unix时间戳:

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

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

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

所以简而言之......

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

执行上述操作时,请务必确保以UTC格式返回相关的时间/日期。