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

将PHP代码中的公历日期转换为Jalali(波斯历)日期

将Gregorian日期转换为Jalali(波斯历)日期的PHP实现

步骤1:添加Gregorian转Jalali的转换函数

PHP没有内置波斯历转换功能,我们可以直接嵌入一个基于标准算法的转换函数:

function gregorian_to_jalali($gy, $gm, $gd, $mod = '') {
    $g_d_m = array(0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334);
    $jy = ($gy <= 1600) ? 0 : 979;
    $gy -= ($gy <= 1600) ? 621 : 1600;
    $gy2 = ($gm > 2) ? ($gy + 1) : $gy;
    $days = (365 * $gy) + ((int)(($gy2 + 3) / 4)) - ((int)(($gy2 + 99) / 100)) + ((int)(($gy2 + 399) / 400)) - 80 + $gd + $g_d_m[$gm - 1];
    $jy += 33 * ((int)($days / 12053));
    $days %= 12053;
    $jy += 4 * ((int)($days / 1461));
    $days %= 1461;
    $jy += (int)(($days - 1) / 365);
    if ($days > 365) $days = ($days - 1) % 365;
    $jm = ($days < 186) ? 1 + (int)($days / 31) : 7 + (int)(($days - 186) / 30);
    $jd = 1 + (($days < 186) ? ($days % 31) : (($days - 186) % 30));
    return ($mod == '') ? array($jy, $jm, $jd) : $jy . $mod . $jm . $mod . $jd;
}

步骤2:修改原代码实现日期转换

替换原代码的日期格式化逻辑,同时可选择显示波斯文月份名称:

// 定义波斯历月份名称(可选,不需要的话可删除这部分)
$jalali_months = [
    1 => 'فروردین',
    2 => 'اردیبهشت',
    3 => 'خرداد',
    4 => 'تیر',
    5 => 'مرداد',
    6 => 'شهریور',
    7 => 'مهر',
    8 => 'آبان',
    9 => 'آذر',
    10 => 'دی',
    11 => 'بهمن',
    12 => 'اسفند'
];

$id = get_the_ID();

$date = get_post_meta($id, 'edgtf_match_date_meta', true);
$dateobj = date_create_from_format('Y-m-d', $date);

// 获取Gregorian日期的年、月、日数值
$gy = (int)date_format($dateobj, 'Y');
$gm = (int)date_format($dateobj, 'm');
$gd = (int)date_format($dateobj, 'd');

// 转换为Jalali日期
list($jy, $jm, $jd) = gregorian_to_jalali($gy, $gm, $gd);

// 选择日期格式:二选一即可
// 格式1:数字形式(如1402/04/03)
// $formatted_date = sprintf('%d/%02d/%02d', $jy, $jm, $jd);

// 格式2:带波斯文月份名称(如3 مرداد 1402)
$formatted_date = sprintf('%d %s %d', $jd, $jalali_months[$jm], $jy);

$time = get_post_meta($id, 'edgtf_match_time_meta', true);
?>

<span class="edgtf-match-date"><?php echo esc_html($formatted_date); ?>, <?php echo esc_attr($time); ?></span>

补充说明

  • 如果不需要波斯文月份,直接使用数字格式的代码即可,删除月份名称数组相关内容。
  • 输出日期时用esc_html替代原代码的esc_attr,更适合处理包含波斯文的文本内容。
  • 转换函数无需依赖外部库,直接嵌入现有代码就能运行。

内容的提问来源于stack exchange,提问作者Sib Themes

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:34:58