中华历法需要大家的帮助「天文学,物理学,计算机学」
我花了一两个月的时间,研究国内的各种历法,发现了彝族人民使用的历法很可能创立于上古时代。
以下是彝族历法实例,出于可编程考虑,我将彝族过年日纳入1月份范围。对于十二月历法,首先介绍二十四节气的概念。
定义「基于天文学」:当北斗七星的斗柄指向某一个方向,同时对应的天体也出现在某一个方向的时候,这一天的物候叫做节气。例如立春的定义为:当北斗七星的斗柄指向东方,木星也出现在东方的时候,这一天叫做立春。二十四节气分为节气和中气,比如立春是第一个,序号为奇数,为节气,雨水是第二个,序号为偶数,为中气。
彝族十月历法 平年365天,闰年366天,4年一闰,一年10个月,平年1月份41天,闰年1月份42天,其它月份36天。
彝族十八月历法 平年365天,闰年366天,4年一闰,一年18个月,平年1月份25天,闰年1月份26天,其它月份20天。
彝族十二月历法 平年365天,闰年366天,4年一闰,一年12个月,平年1月份35天,闰年1月份36天。每一个月以节气为当月第一天。
关于历法的编程实现,我已经有了Java框架,但是目前手中没有合适的编程工具,编程极其困难。目前框架如下:
彝族十月历法:
纪元类 负责记录皇帝年号,比如永乐年,嘉庆年,最好用enumeration实现,以保证线程安全。
年表类 负责日期计算,比如判断这一年是否为闰年,以及这一年有多少天,将永乐3年转换为递推年(1415年)等。
日历类 负责日期存储 比如2023年7月1日,每一个方法都尽量返回新的实例,以保证线程安全。
编程实现思路:以Unix时间戳开始时间为一个参照日期,比如在西洋历法当中的1970年1月2日,要转换到彝族历法当中,只需要计算其和1970年1月1日相差的日期数量,再根据这个数量差值在彝族历法当中调节到这一天即可。注意日期没有第0年,第0月的概念!一定要剔除0!re
目前需要实现的历法:
彝族三种历法「纪年,年表,日历」(十月历法,十八月历法,十二月历法)。需要用到的Java类 java.time.chrono.Era, java.time.chrono.AbstractChronology, java.time.chrono.LocalDate
传统干支历法「纪年,年表,日历,时间」(十二月历法)java.time.chrono.Era, java.time.chrono.AbstractChronology, java.time.chrono.LocalDate, java.time.chrono.LocalDateTime
农历历法「纪年,年表,日历」(十月历法+十二月历法,日编号和干支历法日编号一致)java.time.chrono.Era, java.time.chrono.AbstractChronology, java.time.chrono.LocalDate, java.time.chrono.LocalDateTime
实现历法的重难点-纪月
大月和小月
月份天干和地支
闰月
把太阳系模拟为一个坐标系,以各大行星重合的那一天为历法起点,地球处于y轴负半轴,用作历法计算。当木星的坐标在地球坐标的3点钟方向,北斗七星斗柄指向东方,我们称这一天在地球上为立春。很可惜水星,金星,地球,火星,木星,土星这六颗行星的运行轨道是椭圆形,行星在每个点的运行速度是不一样的,会影响到和地球相对角度的确定。
大致思路为:把所有行星置于y轴负半轴,比如要计算第7天,那么就分别根据行星的每日速度和轨迹计算出第7天的位置,再计算相对于地球的位置。