在yii 1.1.23中,时间戳字段需用yii::app()->dateformatter->format()或模型getter方法格式化为可读日期;注意区分unix时间戳(秒级整型)与datetime字符串,后者须先经strtotime()转换。

在 Yii 1.1.23 中,分页列表(如 CGridView 或手动遍历 CActiveDataProvider 数据)中显示的时间戳字段(如 created_at、updated_at),默认是 Unix 时间戳(整型)或数据库原始时间字符串。要格式化为可读日期(如 2024-05-20 14:30:45),需在视图层或模型层做转换。
在 CGridView 中直接格式化时间戳
适用于字段值为整型时间戳(如 1716215445)的情况:
- 使用
value匿名函数配合date()或Yii::app()->dateFormatter->format() - 推荐用 Yii 内置的
dateFormatter,支持国际化和时区(需配置defaultTimeZone)
示例(admin.php 视图中):
'columns'=>array(
'id',
array(
'name'=>'created_at',
'value'=>'Yii::app()->dateFormatter->format("yyyy-MM-dd HH:mm:ss", $data->created_at)',
),
// 或使用 PHP date()(注意:时间戳需是秒级,且不自动处理时区)
// 'value'=>'date("Y-m-d H:i:s", $data->created_at)',
),
在模型中定义访问器(推荐长期维护方案)
在模型(如 Post.php)中添加 getter 方法,让时间戳字段“看起来”就是格式化后的字符串:
public function getCreatedAtText()
{
if ($this->created_at) {
return Yii::app()->dateFormatter->format('yyyy-MM-dd HH:mm:ss', $this->created_at);
}
return '-';
}
然后在 CGridView 中直接引用:
array(
'name'=>'created_at',
'value'=>'$data->createdAtText',
),
这样既解耦视图逻辑,又便于复用和测试。
注意时间戳单位与类型
常见坑点:
- MySQL 的
DATETIME字段被 ActiveRecord 自动转为string(如"2024-05-20 14:30:45"),不是时间戳 → 不能直接传给dateFormatter->format(),需先用strtotime()转成时间戳 - 若字段是
int(11)存秒级时间戳,直接格式化即可;若是毫秒级(如 JSDate.now()),需先除以 1000 并(int)截断 - 确保
Yii::app()->dateFormatter已正确配置,例如在main.php中设置:'formatter'=>array(<br> 'class'=>'CDateFormatter',<br> 'dateFormat'=>'yyyy-MM-dd',<br> 'timeFormat'=>'HH:mm:ss',<br> 'datetimeFormat'=>'yyyy-MM-dd HH:mm:ss',<br> ),
自定义格式快捷方法(可选)
在组件或行为中封装常用格式,比如:
// 在 components/Helper.php 中
public static function formatDate($timestamp, $pattern = 'yyyy-MM-dd HH:mm:ss')
{
if (!$timestamp) return '-';
return Yii::app()->dateFormatter->format($pattern, is_string($timestamp) ? strtotime($timestamp) : $timestamp);
}
视图中调用:'value'=>'Helper::formatDate($data->created_at)'











