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

基于新基准日的Julian Day计算:6月1日为JD1,1月1日为JD366

自定义儒略日转换方案

核心逻辑梳理

你需要的是一套以6月1日为起始(JD=1),1月1日对应JD=366的自定义日期编号系统。这里的核心矛盾是:同一年中1月1日到6月1日仅相差151/152天,无法直接对应366的编号,因此必须将这个编号系统定义为跨年度的366天周期,即新JD的“年度”覆盖从当年6月1日到下一年6月1日的366天(平年需额外补一天)。

正确转换公式

假设你使用的是常规年日数(DOY:1月1日=1,12月31日=365/366),转换步骤如下:

  1. 确定当年6月1日的DOY:

    • 平年:DOY_jun1 = 152(1-5月总天数31+28+31+30+31=151)
    • 闰年:DOY_jun1 = 153(1-5月总天数31+29+31+30+31=152)
  2. 计算自定义JD(JD_new):

    def get_custom_jd(doy, is_leap_year):
        doy_jun1 = 153 if is_leap_year else 152
        # 计算与6月1日的相对偏移
        if doy >= doy_jun1:
            # 日期在6月1日及之后,属于新年度的前半段
            jd_new = doy - doy_jun1 + 1
        else:
            # 日期在6月1日之前,属于新年度的后半段(跨上一年)
            # 强制1月1日对应366,需补全366天周期的差值
            jd_new = 366 - (doy_jun1 - doy)
        return jd_new
    

强制映射方案(严格满足1月1日=366)

如果必须让同一年的1月1日对应366,需人为将周期固定为366天,公式调整为:

def get_custom_jd_force(doy, is_leap_year):
    doy_jun1 = 153 if is_leap_year else 152
    # 计算偏移后强制映射到1-366,让1月1日=366
    offset = (doy - doy_jun1) % 366
    # 偏移量调整:让1月1日的偏移对应366
    adjusted_offset = (offset + 151) % 366
    return 366 if adjusted_offset == 0 else adjusted_offset + 1

验证强制方案

  • 平年1月1日(DOY=1):返回366 → 符合要求
  • 平年6月1日(DOY=152):返回1 → 符合要求
  • 平年12月31日(DOY=365):返回214 → 符合6月1日到12月31日的实际天数

你之前方案的问题

直接在常规DOY上加152没有考虑周期循环,当DOY≥215时,结果必然超过366。正确的做法是先计算目标日期与6月1日的相对偏移,再通过模运算将结果限制在1-366范围内,同时根据你的需求调整偏移量实现强制映射。

内容的提问来源于stack exchange,提问作者Lucile Mo'

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 02:07:01