一条古老的观测日期,换成连续日数会不会弄错?
同样的年月日,历法不同就可能不是同一天;先选规则,再双向核对。
历史记录写着一个日期,现代程序却需要JD。除了年月日,还要知道它用公历还是儒略历,是否跨过当地改历,以及“公元前”的年号怎样输入。转换不是直接套一张今天的日历。
打开互动课程 →
先猜一下
知道“1582年10月10日”这几个字,就能确定它一定是哪一天吗?
查看答案与解释
还要知道历法与地区规则 — 延伸公历/儒略历可有这个标签,而某些1582混合改历规则跳过了它。
再把体验和科学连起来
先把历法写在日期旁边
同一个年月日字符串,在公历和儒略历里不一定是同一天。程序先明确规则,并拒绝不存在的日期。
日期 + 历法 → 唯一的连续日数
用连续日数跨过改历
罗马规则中10月4日之后接10月15日,日期标签跳了十个数,但时间只过去一天。
1582-10-04 → JD2299159.5;次日JD2299160.5
把JD再变回日历
逆算法先加0.5,以午夜作为拆整数日和日内小数的边界,再求出年月日。
Z=floor(JD+0.5),F为余下小数
负年和MJD也要说明含义
天文年有0年;MJD只是把JD减掉2400000.5,起点不同,描述的时间并没有改变。
MJD = JD − 2400000.5
把计算链展开
若 M≤2:Y←Y−1,M←M+12 A = floor(Y/100) B公历 = 2 − A + floor(A/4);B儒略历 = 0 JD = floor(365.25(Y+4716)) + floor(30.6001(M+1)) + D + B − 1524.5
D包含日内小数。floor是向负无穷取整,不能替换成截去小数;先选择历法,再计算修正B。
试一试
展开日期输入后可改年月日。先比较1582改历前后,再用“从JD查日期”回查;两次转换应指向同一天。
动手看一遍 →
符号不用背
- JD / MJD
- 连续日数 / JD−2400000.5
- 天文年0
- 对应历史纪年的公元前1年
- 延伸历法
- 把同一算术规则向过去或未来延伸,不等于当地历史采用
- 罗马改历规则
- 1582-10-04之后接1582-10-15的特定混合规则
算法、精度与适用范围
补第7章日期到JD、JD回日期、天文负年、历法选取与MJD。正向复用已验证Astro.jd,先独立验证月长闰年;逆向采用印刷页63的Z/F及A/B/C/D/E整数步骤,按明确模式选择公历或儒略历。罗马1582混合模式排除10月5–14日;并不声称全球同日改历。正向支持天文年−4712至3000,逆向支持JD0至3000000,不处理负JD;年0不写成“公元前0年”。24h视为次日0h,跨改历时仍按连续JD前进。MJD午夜为整数,JD正午为整数。此课只做历法算术,同一时间尺度内转换,不混入UT1/TT差值或时区。
我的理解检查
天文纪年的0年,对应通常历史纪年的哪一年?
公元前1年 — 天文年号保留0,历史公元前/后计年通常没有0年。
罗马1582年10月4日到15日,JD应增加多少?
1天 — 在该混合规则中,它们是相邻日期。
MJD=0对应什么?
JD=2400000.5 — MJD换了零点;两者不是同一个数字。
连续时间没有因为改历跳走;变的是日期标签。历法、年号和时间尺度必须写清楚。
Jean Meeus · Astronomical Algorithms, 2nd ed. · 第 7 章