万年历 - java算法实现(6)

2019-08-30 23:16

* 1.冬至所在的UTC日期保存在A[0],根据\规定1\得知在A[0]之前(含A[0])的那个UTC朔日定为年首日期

* 冬至之后的中气分保存在A[1],A[2],A[3]...A[13],其中A[12]又回到了冬至,共计算13次中气

* 2.连续计算冬至后14个朔日,即起算时间时A[0]+1 14个朔日编号为0,1...12,保存在C[0],C[1]...C[13]

* 这14个朔日表示编号为0月,1月,...12月0月的各月终止日期,但要注意实际终止日是新月初一,不属本月

* 这14个朔日同样表示编号为1月,2月...的开始日期

* 设某月编号为n,那么开始日期为C[n-1],结束日期为C[n],如果每月都含中气,该月所含的中气为A[n]

* 注:为了全总计算出13个月的大小月情况,须算出14个朔日。 3.闰年判断:含有13个月的年份是闰年当第13月(月编号12月)终止日期大于冬至日, * 即C[12]〉A[12], 那么该月是新年,本年没月12月,本年共12个月

* 当第13月(月编号12月)终止日期小等于冬至日,即C[12]≤A[12],那么该月是本年的有效月份,本年共13个月 4.闰年中处理闰月:

* 13个月中至少1个月份无中气,首个无中气的月置闰,在n=1...12月中找到闰月,即C[n]≤A[n]

* 从农历年首的定义知道,0月一定含有中气冬至,所以不可能是闰月。首月有时很贪心,除冬至外还可能再吃掉本年或前年的另一个中气

* 定出闰月后,该月及以后的月编号减1 5.以上所述的月编号不是日常生活中说的\正月\二月\等月名称:

* 如果\建子\月为首月,如果\建寅\月的月名\正月\月是\二月\其余类推 *****/

private static final String yueMing[] = { \正\二\三\四\五\六\ \七\八\九\十\十一\十二\

public void paiYue(int y) { // 农历排月序计算,可定出农历 double zq[] = new double[20]; double jq[] = new double[20]; double hs[] = new double[20];

// var zq=new Array(),jq=new Array(), hs=new Array(); //中气表,节气表,日月合朔表 // 从冬至开始,连续计算14个中气时刻 int i;

double t1 = 365.2422 * (y - 2000) - 50; // 农历年首始于前一年的冬至,为了节气中气一起算,取前年大雪之前

for (i = 0; i < 14; i++) { // 计算节气(从冬至开始),注意:返回的是力学时

zq[i] = jiaoCal(t1 + i * 30.4, i * 30 - 90, 0); // 中气计算,冬至的太阳黄经是270度(或-90度) jq[i] = jiaoCal(t1 + i * 30.4, i * 30 - 105, 0); // 顺便计算节气,它不是农历定朔计算所必需的 }

// 在冬至过后,连续计算14个日月合朔时刻

double dongZhiJia1 = zq[0] + 1 - Dint_dec(zq[0], 8, false); // 冬至过后的第一天0点的儒略日数

hs[0] = jiaoCal(dongZhiJia1, 0, 1); // 首月结束的日月合朔时刻 for (i = 1; i < 14; i++)

hs[i] = jiaoCal(hs[i - 1] + 25, 0, 1);

// 算出中气及合朔时刻的日数(不含小数的日数计数,以便计算日期之间的差值) double A[] = new double[20]; double B[] = new double[20]; double C[] = new double[20];

// var A=new Array(), B=new Array(), C=new Array(); for (i = 0; i < 14; i++) { // 取当地UTC日数的整数部分 A[i] = Dint_dec(zq[i], 8, true); B[i] = Dint_dec(jq[i], 8, true); C[i] = Dint_dec(hs[i], 8, true); }

// 闰月及大小月分析 int tot = 12, nun = -1;

int yn[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 0, 0 }; // 月编号 if (C[12] <= A[12]) { // 闰月分析 yn[12] = 12;

tot = 13; // 编号为12的月是本年的有效月份,本年总月数13个 for (i = 1; i < 13; i++) if (C[i] <= A[i]) break;

for (nun = i - 1; i < 13; i++)

yn[i - 1]--; // 注意yn中不含农历首月(所以取i-1),在公历中农历首月总是去年的所以不多做计算 }

String syn[] = new String[20];

for (i = 0; i < tot; i++) { // 转为建寅月名,并做大小月分析

syn[i] = yueMing[(yn[i] + 10) % 12]; // 转建寅月名 if (i == nun) syn[i] += \闰\ else

syn[i] += \月\标记是否闰月 if (C[i + 1] - C[i] > 29) syn[i] += \大\ else

syn[i] += \小\标记大小月 } // 显示

String out = \节气 手表时 中气 手表时 for (i = 0; i < tot; i++) { int zm = (i * 2 + 18) % 24;

int jm = (i * 2 + 17) % 24; // 中气名节气名 setFromJD(jq[i] + J2000 + (double)8 / 24, true); out += jqB[jm] + \显示节气 setFromJD(zq[i] + J2000 + (double)8 / 24, true); out += jqB[zm] + \显示中气 setFromJD(hs[i] + J2000 + (double)8 / 24, true); out += syn[i] + \显示日月合朔 }

System.out.println(out); }

public static void main(String []argv) { SolarTerm st = new SolarTerm(); st.JQtest(2000); //st.paiYue(2500); } }

农历月 朔的手表时/r/n\


万年历 - java算法实现(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:火场逃生十四要诀

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: