Yii框架配置新加坡时区后asTime()方法返回时间不正确如何解决?
问题原因分析
- 全局formatter配置参数错误:
defaultTimeZone参数用于指定输入的原始时间所属时区,你的数据库存储的是UTC时区时间,但配置中误设为了Asia/Singapore,同时缺少指定输出时区的timeZone参数,导致时区转换基准错误。 - GridView列配置冗余冲突:列配置中先后定义了两次
format属性,前者的formatter自定义配置被后者的'format' => 'raw'完全覆盖,且你在value回调中调用的是全局Yii::$app->formatter,该局部配置本身也不会生效。
解决步骤
1. 修正全局formatter配置
修改main.php中的components配置:
'formatter' => [ 'class' => 'yii\i18n\Formatter', 'dateFormat' => 'php:j M Y', 'datetimeFormat' => 'php:d/m/Y h:i a', 'timeFormat' => 'php:H:i A', // 原始数据(数据库存储)的时区为UTC 'defaultTimeZone' => 'UTC', // 输出显示的目标时区为新加坡 'timeZone' => 'Asia/Singapore', ],
2. 清理冗余的GridView列配置
删除列中无效的自定义formatter配置,避免参数冲突:
[ 'attribute' => 'created_at', 'label' => 'Date', 'filter' => false, 'value'=> function($model, $key, $index, $column){ return Search::getDateTime($model); }, 'format' => 'raw', ]
3. 验证依赖扩展(可选)
确认PHP环境已安装intl扩展,Yii的i18n格式化组件依赖该扩展实现时区转换功能,未安装的话需安装后重启服务生效。
效果验证
你提供的示例UTC时间2021-11-22 11:28:16,转换为新加坡时区(UTC+8)后,输出应为:
- 日期:
22 Nov 2021 - 时间:
19:28 PM
内容的提问来源于stack exchange,提问作者Shaho
相关产品推荐
相关产品推荐

