PHP如何将数据库Timestamp类型日期转换为波斯DateTime
如何将MySQL Timestamp字段转换为波斯DateTime格式显示?
问题描述
我有一张数据表,其中包含名为register_date的字段,该字段由数据库自动添加为Timestamp类型。希望将该字段显示为波斯DateTime格式,现有PHP代码片段如下:
<?php $q = "SELECT * from `tbl_registers2`"; $result = $db->query($q); $row = 1; while ($fields = $result->fetch_assoc()) { ?> <tr data-id="<?= $fields['id']; ?>"> <td><?= $row++; ?></td> <td><?= $fields['first_name']; ?></td> <td><?= $fields['last_name']; ?></td> <td><?= $fields['mobile']; ?></td> <td><?= $fields['email']; ?></td> <td><?= $fields['register_date']; ?></td> <td><img class="delete" src="../assets/img/trash.png"></td> <td> <a href="edit.php?id=<?= $fields['id']; ?>">edit</a> </td> </tr> <?php } ?>
解决方案
下面提供两种可靠的实现方式,可根据你的环境选择:
方法一:使用PHP Intl扩展(推荐)
PHP的Intl扩展提供了强大的国际化日期格式化能力,支持波斯历(Jalali)转换,兼容性好且灵活。
步骤:
- 确认Intl扩展已启用:通过
phpinfo()查看,若未启用,在php.ini中添加extension=intl并重启服务器。 - 修改代码处理日期:在循环中对
register_date进行转换,代码如下:
<?php $q = "SELECT * from `tbl_registers2`"; $result = $db->query($q); $row = 1; // 初始化波斯日期格式化器(放在循环外提升性能) $persianFormatter = new IntlDateFormatter( 'fa_IR', // 波斯语区域设置 IntlDateFormatter::LONG, // 日期格式长度 IntlDateFormatter::SHORT, // 时间格式长度 'Asia/Tehran', // 伊朗时区(波斯历常用时区) IntlDateFormatter::TRADITIONAL, // 使用传统波斯日历 'yyyy/MM/dd HH:mm' // 自定义显示格式,可按需调整 ); while ($fields = $result->fetch_assoc()) { // 将Timestamp转换为DateTime对象并格式化为波斯日期 $timestampDate = new DateTime($fields['register_date']); $persianDate = $persianFormatter->format($timestampDate); ?> <tr data-id="<?= $fields['id']; ?>"> <td><?= $row++; ?></td> <td><?= $fields['first_name']; ?></td> <td><?= $fields['last_name']; ?></td> <td><?= $fields['mobile']; ?></td> <td><?= $fields['email']; ?></td> <td><?= $persianDate; ?></td> <!-- 替换为转换后的波斯日期 --> <td><img class="delete" src="../assets/img/trash.png"></td> <td> <a href="edit.php?id=<?= $fields['id']; ?>">edit</a> </td> </tr> <?php } ?>
格式调整说明:
- 若只需显示日期,可将格式字符串改为
'yyyy/MM/dd' - 若需完整时间,可改为
'yyyy/MM/dd HH:mm:ss' - 时区可根据实际需求调整(如
Asia/Tehran对应伊朗标准时间)
方法二:直接通过MySQL查询转换(适用于MySQL 8.0+)
MySQL 8.0及以上版本支持直接指定波斯日历进行日期格式化,可在查询阶段完成转换,减少PHP端处理逻辑。
修改SQL查询语句:
SELECT *, DATE_FORMAT(register_date, '%Y/%m/%d %H:%i', 'persian') AS persian_register_date FROM `tbl_registers2`
调整PHP代码:
将原来输出register_date的部分替换为转换后的字段:
<td><?= $fields['persian_register_date']; ?></td>
注意事项:
- 需确保MySQL版本为8.0或更高,低版本不支持
DATE_FORMAT的第三个日历参数 - 若数据库时区与波斯历时区不一致,需先通过
CONVERT_TZ转换时区,例如:
其中DATE_FORMAT(CONVERT_TZ(register_date, '+00:00', '+03:30'), '%Y/%m/%d %H:%i', 'persian') AS persian_register_date+00:00是UTC时区,+03:30是伊朗时区,可根据实际情况调整。
内容的提问来源于stack exchange,提问作者Unique631
相关产品推荐
相关产品推荐

