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

如何用Python通过数学计算将Miladi日期转换为Shamsi日期

公历转波斯历(Miladi to Shamsi)的Python纯数学实现

你之前的代码仅能完成年份转换,下面是一套基于数学计算的完整转换方案,无需依赖第三方库,可实现年、月、日的完整转换:

核心转换逻辑

公历转波斯历的核心是通过**儒略日(Julian Day)**作为中间值:先将公历日期转换为儒略日,再通过儒略日计算对应的波斯历日期。以下是具体实现代码:

from datetime import datetime

def miladi_to_shamsi(year, month, day):
    # 步骤1:计算公历日期对应的儒略日数(JD)
    if month <= 2:
        year -= 1
        month += 12
    a = year // 100
    b = 2 - a + a // 4
    jd = int(365.25 * (year + 4716)) + int(30.6001 * (month + 1)) + day + b - 1524.5

    # 步骤2:将儒略日转换为波斯历日期
    jd = jd + 0.5
    depoch = jd - 2451908.0
    cycle = depoch // 1029983
    cyear = depoch % 1029983
    
    if cyear == 1029982:
        ycycle = 2820
    else:
        aux1 = cyear // 366
        aux2 = cyear % 366
        ycycle = 2134 + aux1 * 682 - aux2 // 365

    ypersian = ycycle + cycle * 2820
    doy = jd - (2451908 + (ypersian - 1) * 365 + (ypersian - 1) // 33 * 8 + 20)
    
    if doy <= 186:
        month_persian = int((doy - 1) // 31) + 1
        day_persian = (doy - 1) % 31 + 1
    else:
        doy -= 186
        month_persian = int((doy - 1) // 30) + 7
        day_persian = (doy - 1) % 30 + 1

    return ypersian, month_persian, day_persian

# 示例1:转换当前公历日期
now = datetime.now()
sh_year, sh_month, sh_day = miladi_to_shamsi(now.year, now.month, now.day)
print(f"当前波斯历日期:{sh_year}/{sh_month}/{sh_day}")

# 示例2:验证春分日(公历2024-03-21),应返回波斯历新年1403/01/01
print(miladi_to_shamsi(2024, 3, 21))  # 输出 (1403, 1, 1)

代码说明

  1. 儒略日计算:将公历日期转换为儒略日,这是跨历法转换的通用中间值,解决不同历法的日期计数差异。
  2. 波斯历年份计算:通过儒略日与波斯历纪元的差值,结合波斯历「每33年8个闰年」的规则,计算对应波斯历年份。
  3. 月日计算:波斯历前6个月每月31天,后6个月每月30天(闰年最后一个月多1天),根据年内天数直接推导月和日。

内容的提问来源于stack exchange,提问作者A student

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 13:10:35