跳转到主要内容
基础知识

历法的历史 - 从儒略历到格里历及其演变

三种历法类型 - 阳历、阴历、阴阳历

历法根据优先追踪的天体周期分为三类。阳历追踪地球绕太阳的公转 (约 365.2422 天),使季节与日历日期保持对齐。阴历追踪月球的朔望周期 (约 29.5306 天),12 个阴历月总计约 354 天,会在季节间漂移。阴阳历采取折中方案: 月份跟随月相,但定期插入闰月以使年份与太阳周期保持一致。

当今国际通用的格里历是阳历。伊斯兰 (回历) 历是纯阴历,这就是为什么斋月每个格里历年都提前约 11 天。日本传统历法和中国农历是阴阳历,因此农历新年在每个格里历年中会在 30 天的窗口内移动,取决于何时插入闰月。

儒略历 - 凯撒的改革及其漂移

公元前 46 年,尤利乌斯·凯撒采纳了埃及天文学家索西琴尼的建议,改革了罗马历法。儒略历将一年的长度定为 365.25 天,每四年设一个闰日,其对太阳年的逼近远优于此前那个受政治操纵而已偏离季节近三个月的罗马历。

然而实际太阳年为 365.2422 天,儒略历系统每年多出 0.0078 天 (约 11 分 14 秒)。这个差异每 128 年累积一天,到 16 世纪已累积约 12.5 天。到 1582 年,春分落在 3 月 11 日而非 3 月 21 日,威胁到依赖天文事件计算的复活节及其他宗教节日的日期确定。

格里历改革 - 十天被抹去

教皇格里高利十三世于 1582 年颁布了历法改革。为解决累积的漂移,1582 年 10 月 4 日的下一天直接变为 10 月 15 日,删去了 10 个日历日。闰年规则也做了修改: 能被 100 整除的年份不是闰年,但能被 400 整除的年份是闰年。这一调整将平均年长缩短为 365.2425 天。

精度提升是巨大的: 新系统与实际太阳年之间约每 3,236 年才漂移一天。天主教国家 (意大利、西班牙、葡萄牙) 立即采用。新教国家抵制“教皇的日历”: 英国直到 1752 年才切换,俄国在 1918 年革命后才采用,希腊直到 1923 年。这次改革的接受过程说明了政治和宗教认同如何塑造一个看似纯科学的问题。

仍在使用的历法

尽管格里历是国际标准,许多历法仍出于宗教和文化目的并行使用。伊斯兰历是纯阴历,决定斋月和朝觐的时间。希伯来历是阴阳历,在 19 年的默冬周期中插入 7 个闰月,以使逾越节与春天对齐。

埃塞俄比亚历比格里历落后约 7-8 年,采用 13 个月 (12 个 30 天的月加上一个 5 或 6 天的月)。泰国官方使用佛历,在格里历年份上加 543。这些仍在使用的历法意味着软件国际化不能简化为翻译; 日期逻辑必须适应根本不同的计数系统。

软件中的历法多样性

代码中的日期处理比表面看起来更复杂。JavaScript 的 Intl.DateTimeFormat 接受 calendar 选项,如 'islamic'、'hebrew'、'chinese' 或 'japanese' (日本年号),允许同一个 Date 对象在不同历法下呈现。Java 的 java.time 包提供了 HijrahChronology、JapaneseChronology 等作为一等年表实现。

问题在于不同历法的月长、年长和闰法各不相同,因此日期运算也随之变化。格里历中“一个月后”可以是 28-31 天,伊斯兰历中是 29-30 天,埃塞俄比亚历中则固定为 30 天。多历法应用需要一个抽象日期层,将运算委托给特定年表的实现,而非在整个代码库中硬编码格里历假设。

XB!LINE

这篇文章对您有帮助吗?

相关文章