如何在CakePHP中处理用户在应用程序和数据库之间的时区和UTC同步?

时间:2018-03-14 14:33:37

标签: php datetime cakephp timezone utc

我需要在用户的时区显示日期和时间。但我还需要以UTC格式保存日期和时间,因此我的数据库保持一致。

我的cakephp应用程序配置如下:

在config / app.php文件中:

 'Datasources' => [
    'default' => [
        ...
        'timezone' => 'UTC',

在config / bootstrap.php文件中:

/*
 * Set server timezone to UTC. You can change it to another timezone of your
 * choice but using UTC makes time calculations / conversions easier.
 */
date_default_timezone_set('UTC');

在我的应用程序中,用户可以随时更改其时区。然后将其保存在数据库中,并在控制器中显示为$this->Account->timezone,在视图中显示为$account->timezone

所以,让我们说我的数据库是一致的,我的所有日​​期时间都以UTC格式存储,所以当用户输入日期时,它会转换为UTC(来自他的时区)。

现在我要显示这些日期。我从UTC的数据库中获取它们。现在我使用Cakephp中的方法(其中$item是一个实体,date是该实体的一个属性):

$item->date->i18nFormat('dd/MM',$user->timezone),

使用此功能,我可以轻松地以我想要的格式和我想要的时区显示日期时间。

有没有办法将$user->timezone设置为整个应用,所以我不需要每次都指定它?

感谢。

1 个答案:

答案 0 :(得分:2)

您的问题看起来好像您在保存用户提供的日期时已经处理了时区转换,因此我会坚持使用显示部件。

使用时间助手

正如评论中所述,在需要时明确传递时区没有任何问题,但是如果你真的需要调整(大部分)你在视图模板中输出的所有内容的时区,那么请看一下(未记录的)时间助手的outputTimezone选项。

$this->loadHelper('Time', ['outputTimezone' => $user->timezone]);

然后使用帮助器的i18nFormat()方法,你应该对时区转换很好:

$this->Time->i18nFormat($item->date, 'dd/MM');

配置全局字符串格式

也可以通过\Cake\I18n\DateFormatTrait::setToStringFormat()全局配置输出格式  和\Cake\Chronos\Traits\FormattingTrait::setToStringFormat()方法,相应地在Date/Time/FrozenDate/FrozenTime/Chronos类上提供。

以下将导致所有“仅限日期”对象在转换为字符串时被格式化为dd/MM,无论是通过隐式转换,还是在调用示例i18nFormat()时显式格式化传递特定格式:

\Cake\I18n\Date::setToStringFormat('dd/MM');

另见