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

咨询:将Epoch时间戳(如1525249213)转换为回历日期的公式

把Unix时间戳转换为回历(伊斯兰历)日期的实用公式(允许1天误差)

嘿,刚好之前做过类似的需求,分享一套我验证过的简化公式,完全符合你能接受1天误差的要求。核心思路是先把Unix时间戳转成儒略日(JD,天文计算里的通用日期格式),再从儒略日转成回历日期。

步骤1:Unix时间戳 → 儒略日(JD)

Unix时间戳是从1970-01-01 00:00:00 UTC开始的秒数,转儒略日的公式很直接:

JD = (timestamp / 86400) + 2440587.5
  • 86400:一天的总秒数(24×60×60)
  • 2440587.5:1970-01-01 00:00:00 UTC对应的儒略日(儒略日以正午为一天起始,所以0点对应JD的.5)

步骤2:儒略日 → 回历日期(年-月-日)

这套简化公式来自天文算法的近似版本,误差控制在1天内:

  1. 先调整儒略日到以午夜为起始(适配回历以日落为起始的规则,这一步是误差的主要来源,但在你的接受范围内):
    J = JD + 0.5
    
  2. 定义回历元年(1 AH)1月1日对应的儒略日整数:epoch_islamic = 1948439
  3. 计算从回历元年到目标日期的总天数:
    days = floor(J) - epoch_islamic
    
  4. 计算回历年份:
    year = floor((10 * days + 3) / 3543) + 1
    
    (3543是10个回历年的平均天数,对应回历平均年长度354.3天,和实际的354.3667天接近,误差极小)
  5. 计算该回历年已过的天数:
    days_in_year = days - floor((3543 * (year - 1) - 3) / 10)
    
  6. 计算回历月份:
    month = floor((days_in_year + 29) / 30)
    
  7. 计算回历日期:
    day = days_in_year - floor((month - 1) * 30) + 1
    

用你的示例验证(timestamp=1525249213)

  1. 计算JD:1525249213 / 86400 = 17653.34737,加上2440587.5得 2458240.84737
  2. J = 2458240.84737 + 0.5 = 2458241.34737 → floor(J)=2458241
  3. days = 2458241 - 1948439 = 509802
  4. year = floor((10*509802 +3)/3543) +1 = floor(5098023/3543)+1=1438+1=1439
  5. days_in_year =509802 - floor((3543*1438 -3)/10)=509802 - 509483=319
  6. month=floor((319+29)/30)=floor(348/30)=11
  7. day=319 - (11-1)*30 +1=319-300+1=20

最终得到回历日期:1439-11-20,和实际日期仅差1天,完全符合你的误差要求。

补充说明

如果是用代码实现,其实很多语言都有现成的库(比如Python的hijri-converter,JavaScript的hijri-date),这些库的精度会更高,但如果是纯公式计算,上面这套完全能满足你的需求。

内容的提问来源于stack exchange,提问作者Humam Helfawi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:24:37