Yii2框架中如何在查询内将Unix时间戳转换为可读时间戳?
当然可以直接在查询语句里实现!而且有两种实用思路,看你偏好哪种场景:
方法一:数据库层面直接转换(推荐,减少PHP端额外处理)
不同数据库的时间戳转换函数不一样,我给你列几个常用场景的写法:
MySQL/MariaDB:用
FROM_UNIXTIME()函数,把Unix时间戳转成指定格式的字符串,参数格式和PHP的date()函数类似
修改你的查询代码如下:$query = (new \yii\db\Query()) ->select([ 'created_at' => 'FROM_UNIXTIME(a.created_at, "%Y-%m-%d %H:%i:%s")', 'updated_at' => 'FROM_UNIXTIME(a.updated_at, "%Y-%m-%d %H:%i:%s")', ]) ->from(['a' => 'product']) ->all();PostgreSQL:需要先用
TO_TIMESTAMP()把秒数转成时间类型,再用TO_CHAR()格式化输出:$query = (new \yii\db\Query()) ->select([ 'created_at' => "TO_CHAR(TO_TIMESTAMP(a.created_at), 'YYYY-MM-DD HH24:MI:SS')", 'updated_at' => "TO_CHAR(TO_TIMESTAMP(a.updated_at), 'YYYY-MM-DD HH24:MI:SS')", ]) ->from(['a' => 'product']) ->all();SQL Server:通过
DATEADD()把Unix秒数加到1970-01-01基准时间上,再转成字符串格式:$query = (new \yii\db\Query()) ->select([ 'created_at' => "CONVERT(VARCHAR, DATEADD(SECOND, a.created_at, '1970-01-01'), 20)", 'updated_at' => "CONVERT(VARCHAR, DATEADD(SECOND, a.updated_at, '1970-01-01'), 20)", ]) ->from(['a' => 'product']) ->all();这里的
20是SQL Server内置的格式码,对应YYYY-MM-DD HH:MI:SS。
方法二:PHP/Yii层面处理查询结果
如果不想在数据库层做转换,也可以先拿到原始Unix时间戳,再在PHP里统一格式化:
$query = (new \yii\db\Query()) ->select(['a.created_at', 'a.updated_at']) ->from(['a' => 'product']) ->all(); // 遍历结果转换格式 $formattedData = array_map(function($item) { $item['created_at'] = date('Y-m-d H:i:s', $item['created_at']); $item['updated_at'] = date('Y-m-d H:i:s', $item['updated_at']); return $item; }, $query);
⚠️ 注意:如果你的Unix时间戳是毫秒级(比如13位数字),不管用哪种方法都要先除以1000,比如MySQL里要写成FROM_UNIXTIME(a.created_at/1000, "%Y-%m-%d %H:%i:%s"),PHP里则是date('Y-m-d H:i:s', $item['created_at']/1000),别忽略这个细节!
内容的提问来源于stack exchange,提问作者user759235
相关产品推荐
相关产品推荐

