万年历 - java算法实现(10)
* 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\
…… 此处隐藏:940字,全部文档内容请下载后查看。喜欢就下载吧 ……相关推荐:
- [实用模板]第八章:法国“新浪潮”与“左岸派”
- [实用模板]2021年北京上半年临床医学检验技师生物
- [实用模板]SAP GUI 7.10客户端安装配置文档
- [实用模板]2001年临床执业医师资格考试综合笔试试
- [实用模板]36机场工作实用英语词汇总结
- [实用模板](一)社会保险稽核通知书
- [实用模板]安全教育主题班会材料
- [实用模板]濉溪县春季呼吸道传染病防控应急演练方
- [实用模板]长沙房地产市场周报(1.30-2.3)
- [实用模板]六年级数学上册典中点 - 图文
- [实用模板]C程序设计(红皮书)习题官方参考答案
- [实用模板]中国证监会第一届创业板发行审核委员会
- [实用模板]桥梁工程复习题
- [实用模板]2011学而思数学及答案
- [实用模板]初中病句修改专项练习
- [实用模板]监理学习知识1 - 图文
- [实用模板]小机灵杯四年级试题
- [实用模板]国贸专业毕业论文模板
- [实用模板]教育学概论考试练习题-判断题4
- [实用模板]2015届高考英语一轮复习精品资料(译林
- 00Nkmhe_市场营销学工商管理_电子商务_
- 事业单位考试法律常识
- 诚信教育实施方案
- 吉大小天鹅食品安全检测箱方案(高中低
- 房地产销售培训资料
- 高一地理必修1复习提纲
- 新概念英语第二册lesson_1_练习题
- 证券公司内部培训资料
- 小学英语时间介词专项练习
- 新世纪英语专业综合教程(第二版)第1册U
- 【新课标】浙教版最新2018年八年级数学
- 工程建设管理纲要
- 外研版 必修一Module 4 A Social Surve
- Adobe认证考试 AE复习资料
- 基于H.264AVC与AVS标准的帧内预测技术
- 《食品检验机构资质认定管理办法》(质
- ABB变频器培训课件
- (完整版)小学说明文阅读练习题及答案
- 深思洛克(SenseLock) 深思IV,深思4,深
- 弟子规全文带拼音




