You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)转换,兼容性好且灵活。

步骤:

  1. 确认Intl扩展已启用:通过phpinfo()查看,若未启用,在php.ini中添加extension=intl并重启服务器。
  2. 修改代码处理日期:在循环中对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 08:40:31