我需要在用户的时区显示日期和时间。但我还需要以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
设置为整个应用,所以我不需要每次都指定它?
感谢。
答案 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');