📄 lunar.js
字号:
/*********************************
=====以下是公历、农历、回历综合日历计算=====
Lunar:日历计算物件
使用条件:事先引用eph.js、JN.js、kwb.js三个文件
一、 calc:function(jd,jing)方法
·功能:
农历排月序计算,可定出农历基本信息(如大小月、闰月、合朔等)
·入口参数:
jd是J2000.0起算的儒略日数TD,使用UT也可以
jing=1表示精算合朔及节气时刻
jing=0则是精算,但在日期临界时精算
·返回:
leap 闰月位置(即置闰的月序号),0表示不置闰
ym 数组,各月名称,共12或13个有效月分
ZQ: 数组,节气表(整数儒略日),25个有效,整数儒略日对应该日的12:00:00
HS 数组,合朔表(整数儒略日),15个有效,整数儒略日对应该日的12:00:00
dx 数组,14个有效
nu 数组,闰月情况,14个有效
ZQ.mangzhong 芒种儒略日,计算入梅用到
ZQ.xiaoshu 小暑儒略日,计算出梅用到
ZQ.liqiu 立秋儒略日,计算三伏用到
ZQ.lichun 立春儒略日,计算纪年用到
二、Lunar.calc2(By,Bm,sw)方法
·功能:
计算某一个月的“公历、农历、回历”三合历
·入口参数:
By是年(公历)
Bm是月(公历)
sw表示是否计算月相及节气时刻。
·返回:
结果返回在Lunar.lun中,它是一个数组,以下说明简写为lun,它包含完整的公历一个月的信息。
lun[0]是本月第一天信息,lun[2]为第二天,其余类推。
lun中的各元数下文记作ob。
·注意:
此函数被调用时,Lunar.calc()被执行
·公历月信息
lun.w0 本月第一天的星期
lun.y 公历年份
lun.m 公历月分
lun.d0 月首的J2000.0起算的儒略日数
lun.dn 本月的天数
lun.Ly 该年的干支纪年
lun.ShX 该年的生肖
lun.nianhao.nh 年号
lun.nianhao.nh2 年号详细
·各日公历信息
ob.d0 2000.0起算儒略日,北京时12:00
ob.di 所在公历月内日序数
ob.y 所在公历年,同lun.y
ob.m 所在公历月,同lun.m
ob.d 日名称(公历)
ob.dn 所在公历月的总天数,同lun.d0
ob.week0所在月的月首的星期,同lun.w0
ob.week 星期
ob.weeki在本月中的周序号
ob.weekN本月的总周数
·各日农历信息
ob.Ldi 距农历月首的编移量,0对应初一
ob.Ldc 日名称(农历)
ob.cur_dz 距冬至的天数
ob.cur_xz 距夏至的天数
ob.cur_lq 距立秋的天数
ob.cur_mz 距芒种的天数
ob.cur_xs 距小暑的天数
ob.Lmc 月名称
ob.Ldn 月大小
ob.Lleap闰状况(值为'闰'或空串)
ob.Lmc2 下个月名称,判断除夕时要用到
·各日的农历纪年、月、日、时及星座
ob.Lyear 农历纪年(10进制,1984年起算,分界点可以是立春也可以是春节,在程序中选择一个)
ob.Lyear2 干支纪年
ob.Lmonth 纪月处理,1998年12月7日(大雪)开始连续进行节气计数,0为甲子
ob.Lmonth2 干支纪月
ob.Lday2 纪日
ob.Ltime2 纪时
ob.XiZ 星座
·各日节日信息
ob.A 重要喜庆日子名称(可将日子名称置红)
ob.B 重要日子名称
ob.C 各种日子名称(连成一大串)
ob.Fjia 放假日子(可用于日期数字置红)
·各日回历信息
ob.Hyear 年(回历)
ob.Hmonth 月(回历)
ob.Hday 日(回历)
·其它信息,sw=1时有效
ob.yxmc 月相名称
ob.yxjd 月相时刻(儒略日)
ob.yxsj 月相时间串
ob.jqmc 节气名称
ob.jqjd 节气时刻(儒略日)
ob.jqsj 节气时间串
**********************************/
/************************
第一部分:古代日历生成
适用范围 -103年2月22日——1959年12月
平气平朔计算使用古历参数进行计算
定朔、定气计算使用开普勒椭圆轨道计算,同时考虑了光行差和力学时与UT1的时间差
古代历算仅在晚期才使用开普勒方法计算,此前多采用一些修正表并插值得到,精度很低,与本程序中
的开普勒方法存在误差,造成朔日计算错误1千多个,这些错误使用一个修正表进行订正。同样,定气部分
也使用了相同的方法时行订正。
suo_high()与qi_high()依赖外部星历函数
*************************/
function qiSuo_jieya(s){ //气朔解压缩
s=s.replace(/J/g,'00');
s=s.replace(/I/g,'000');
s=s.replace(/H/g,'0000');
s=s.replace(/G/g,'00000');
s=s.replace(/t/g,'02');
s=s.replace(/s/g,'002');
s=s.replace(/r/g,'0002');
s=s.replace(/q/g,'00002');
s=s.replace(/p/g,'000002');
s=s.replace(/o/g,'0000002');
s=s.replace(/n/g,'00000002');
s=s.replace(/m/g,'000000002');
s=s.replace(/l/g,'0000000002');
s=s.replace(/k/g,'01');
s=s.replace(/j/g,'0101');
s=s.replace(/i/g,'001');
s=s.replace(/h/g,'001001');
s=s.replace(/g/g,'0001');
s=s.replace(/f/g,'00001');
s=s.replace(/e/g,'000001');
s=s.replace(/d/g,'0000001');
s=s.replace(/c/g,'00000001');
s=s.replace(/b/g,'000000001');
s=s.replace(/a/g,'0000000001');
var o="0000000000",o2=o+o;
s=s.replace(/A/g,o2+o2+o2);
s=s.replace(/B/g,o2+o2+o);
s=s.replace(/C/g,o2+o2);
s=s.replace(/D/g,o2+o);
s=s.replace(/E/g,o2);
s=s.replace(/F/g,o);
return s;
}
//气朔日期计算公式:D = k*n + b , 式中n=0,1,2,3,...,N-1, N为该式适用的范围
//h表示k不变b允许的误差,如果b不变则k许可误差为h/N
//每行第1个参数为k,第2参数为b
//朔直线拟合参数
var suoKB=Array(
1457698.231017,29.53067166, // -721-12-17 h=0.00032 古历·春秋
1546082.512234,29.53085106, // -479-12-11 h=0.00053 古历·战国
1640640.735300,29.53060000, // -221-10-31 h=0.01010 古历·秦汉
1642472.151543,29.53085439, // -216-11-04 h=0.00040 古历·秦汉
1683430.509300,29.53086148, // -104-12-25 h=0.00313 汉书·律历志(太初历)平气平朔
1752148.041079,29.53085097, // 85-02-13 h=0.00049 后汉书·律历志(四分历)
1807665.420323,29.53059851, // 237-02-12 h=0.00033 晋书·律历志(景初历)
1883618.114100,29.53060000, // 445-01-24 h=0.00030 宋书·律历志(何承天元嘉历)
1907360.704700,29.53060000, // 510-01-26 h=0.00030 宋书·律历志(祖冲之大明历)
1936596.224900,29.53060000, // 590-02-10 h=0.01010 随书·律历志(开皇历)
1939135.675300,29.53060000, // 597-01-24 h=0.00890 随书·律历志(大业历)
1947168.00// 619-01-21
);
//气直线拟合参数
var qiKB=Array(
1640650.479938,15.21842500, // -221-11-09 h=0.01709 古历·秦汉
1642476.703182,15.21874996, // -216-11-09 h=0.01557 古历·秦汉
1683430.515601,15.218750011, // -104-12-25 h=0.01560 汉书·律历志(太初历)平气平朔 回归年=365.25000
1752157.640664,15.218749978, // 85-02-23 h=0.01559 后汉书·律历志(四分历) 回归年=365.25000
1807675.003759,15.218620279, // 237-02-22 h=0.00010 晋书·律历志(景初历) 回归年=365.24689
1883627.765182,15.218612292, // 445-02-03 h=0.00026 宋书·律历志(何承天元嘉历) 回归年=365.24670
1907369.128100,15.218449176, // 510-02-03 h=0.00027 宋书·律历志(祖冲之大明历) 回归年=365.24278
1936603.140413,15.218425000, // 590-02-17 h=0.00149 随书·律历志(开皇历) 回归年=365.24220
1939145.524180,15.218466998, // 597-02-03 h=0.00121 随书·律历志(大业历) 回归年=365.24321
1947180.798300,15.218524844, // 619-02-03 h=0.00052 新唐书·历志(戊寅元历)平气定朔 回归年=365.24460
1964362.041824,15.218533526, // 666-02-17 h=0.00059 新唐书·历志(麟德历) 回归年=365.24480
1987372.340971,15.218513908, // 729-02-16 h=0.00096 新唐书·历志(大衍历,至德历) 回归年=365.24433
1999653.819126,15.218530782, // 762-10-03 h=0.00093 新唐书·历志(五纪历) 回归年=365.24474
2007445.469786,15.218535181, // 784-02-01 h=0.00059 新唐书·历志(正元历,观象历) 回归年=365.24484
2021324.917146,15.218526248, // 822-02-01 h=0.00022 新唐书·历志(宣明历) 回归年=365.24463
2047257.232342,15.218519654, // 893-01-31 h=0.00015 新唐书·历志(崇玄历) 回归年=365.24447
2070282.898213,15.218425000, // 956-02-16 h=0.00149 旧五代·历志(钦天历) 回归年=365.24220
2073204.872850,15.218515221, // 964-02-16 h=0.00166 宋史·律历志(应天历) 回归年=365.24437
2080144.500926,15.218530782, // 983-02-16 h=0.00093 宋史·律历志(乾元历) 回归年=365.24474
2086703.688963,15.218523776, // 1001-01-31 h=0.00067 宋史·律历志(仪天历,崇天历) 回归年=365.24457
2110033.182763,15.218425000, // 1064-12-15 h=0.00669 宋史·律历志(明天历) 回归年=365.24220
2111190.300888,15.218425000, // 1068-02-15 h=0.00149 宋史·律历志(崇天历) 回归年=365.24220
2113731.271005,15.218515671, // 1075-01-30 h=0.00038 李锐补修(奉元历) 回归年=365.24438
2120670.840263,15.218425000, // 1094-01-30 h=0.00149 宋史·律历志 回归年=365.24220
2123973.309063,15.218425000, // 1103-02-14 h=0.00669 李锐补修(占天历) 回归年=365.24220
2125068.997336,15.218477932, // 1106-02-14 h=0.00056 宋史·律历志(纪元历) 回归年=365.24347
2136026.312633,15.218472436, // 1136-02-14 h=0.00088 宋史·律历志(统元历,乾道历,淳熙历) 回归年=365.24334
2156099.495538,15.218425000, // 1191-01-29 h=0.00149 宋史·律历志(会元历) 回归年=365.24220
2159021.324663,15.218425000, // 1199-01-29 h=0.00149 宋史·律历志(统天历) 回归年=365.24220
2162308.575254,15.218461742, // 1208-01-30 h=0.00146 宋史·律历志(开禧历) 回归年=365.24308
2178485.706538,15.218425000, // 1252-05-15 h=0.04606 淳祐历 回归年=365.24220
2178759.662849,15.218445786, // 1253-02-13 h=0.00231 会天历 回归年=365.24270
2185334.020800,15.218425000, // 1271-02-13 h=0.00520 宋史·律历志(成天历) 回归年=365.24220
2187525.481425,15.218425000, // 1277-02-12 h=0.00520 本天历 回归年=365.24220
2188621.191481,15.218437484, // 1280-02-13 h=0.00013 元史·历志(郭守敬授时历) 回归年=365.24250
2321919.49// 1645-02-04
);
// 619-01-21开始16598个朔日修正表 d0=1947168
suoS ="EqoFscDcrFpmEsF2DfFideFelFpFfFfFiaipqti1ksttikptikqckstekqttgkqttgkqteksttikptikq2fjstgjqttjkqttgkqt";
suoS+="ekstfkptikq2tijstgjiFkirFsAeACoFsiDaDiADc1AFbBfgdfikijFifegF1FhaikgFag1E2btaieeibggiffdeigFfqDfaiBkF";
suoS+="1kEaikhkigeidhhdiegcFfakF1ggkidbiaedksaFffckekidhhdhdikcikiakicjF1deedFhFccgicdekgiFbiaikcfi1kbFibef";
suoS+="gEgFdcFkFeFkdcfkF1kfkcickEiFkDacFiEfbiaejcFfffkhkdgkaiei1ehigikhdFikfckF1dhhdikcfgjikhfjicjicgiehdik";
suoS+="cikggcifgiejF1jkieFhegikggcikFegiegkfjebhigikggcikdgkaFkijcfkcikfkcifikiggkaeeigefkcdfcfkhkdgkegieid";
suoS+="hijcFfakhfgeidieidiegikhfkfckfcjbdehdikggikgkfkicjicjF1dbidikFiggcifgiejkiegkigcdiegfggcikdbgfgefjF1";
suoS+="kfegikggcikdgFkeeijcfkcikfkekcikdgkabhkFikaffcfkhkdgkegbiaekfkiakicjhfgqdq2fkiakgkfkhfkfcjiekgFebicg";
suoS+="gbedF1jikejbbbiakgbgkacgiejkijjgigfiakggfggcibFifjefjF1kfekdgjcibFeFkijcfkfhkfkeaieigekgbhkfikidfcje";
suoS+="aibgekgdkiffiffkiakF1jhbakgdki1dj1ikfkicjicjieeFkgdkicggkighdF1jfgkgfgbdkicggfggkidFkiekgijkeigfiski";
suoS+="ggfaidheigF1jekijcikickiggkidhhdbgcfkFikikhkigeidieFikggikhkffaffijhidhhakgdkhkijF1kiakF1kfheakgdkif";
suoS+="iggkigicjiejkieedikgdfcggkigieeiejfgkgkigbgikicggkiaideeijkefjeijikhkiggkiaidheigcikaikffikijgkiahi1";
suoS+="hhdikgjfifaakekighie1hiaikggikhkffakicjhiahaikggikhkijF1kfejfeFhidikggiffiggkigicjiekgieeigikggiffig";
suoS+="gkidheigkgfjkeigiegikifiggkidhedeijcfkFikikhkiggkidhh1ehigcikaffkhkiggkidhh1hhigikekfiFkFikcidhh1hit";
suoS+="cikggikhkfkicjicghiediaikggikhkijbjfejfeFhaikggifikiggkigiejkikgkgieeigikggiffiggkigieeigekijcijikgg";
suoS+="ifikiggkideedeijkefkfckikhkiggkidhh1ehijcikaffkhkiggkidhh1hhigikhkikFikfckcidhh1hiaikgjikhfjicjicgie";
suoS+="hdikcikggifikigiejfejkieFhegikggifikiggfghigkfjeijkhigikggifikiggkigieeijcijcikfksikifikiggkidehdeij";
suoS+="cfdckikhkiggkhghh1ehijikifffffkhsFngErD1pAfBoDd1BlEtFqA2AqoEpDqElAEsEeB2BmADlDkqBtC1FnEpDqnEmFsFsAFn";
suoS+="llBbFmDsDiCtDmAB2BmtCgpEplCpAEiBiEoFqFtEqsDcCnFtADnFlEgdkEgmEtEsCtDmADqFtAFrAtEcCqAE1BoFqC1F1DrFtBmF";
suoS+="tAC2ACnFaoCgADcADcCcFfoFtDlAFgmFqBq2bpEoAEmkqnEeCtAE1bAEqgDfFfCrgEcBrACfAAABqAAB1AAClEnFeCtCgAADqDoB";
suoS+="mtAAACbFiAAADsEtBqAB2FsDqpFqEmFsCeDtFlCeDtoEpClEqAAFrAFoCgFmFsFqEnAEcCqFeCtFtEnAEeFtAAEkFnErAABbFkAD";
suoS+="nAAeCtFeAfBoAEpFtAABtFqAApDcCGJ";
//1645-02-03开始7582个节气修正表
qiS ="EmcFs22AFsckF2tsDtFqEtF1posFdFgiFseFtmelpsEfhkF2anmelpFlF1ikrotcnEqEq2FfqmcDsrFor22FgFrcgDscFs22FgEe";
qiS+="FtE2sfFs22sCoEsaF2tsD1FpeE2eFsssEciFsFnmelpFcFhkF2tcnEqEpFgkrotcnEqrEtFermcDsrE222FgBmcmr22DaEfnaF22";
qiS+="2sD1FpeForeF2tssEfiFpEoeFssD1iFstEqFppDgFstcnEqEpFg11FscnEqrAoAF2ClAEsDmDtCtBaDlAFbAEpAAAAAD2FgBiBqo";
qiS+="BbnBaBoAAAAAAAEgDqAdBqAFrBaBoACdAAf1AACgAAAeBbCamDgEifAE2AABa1C1BgFdiAAACoCeE1ADiEifDaAEqAAFe1AcFbcA";
qiS+="AAAAF1iFaAAACpACmFmAAAAAAAACrDaAAADG0";
suoS = qiSuo_jieya(suoS); //定朔修正表解压
qiS = qiSuo_jieya(qiS); //定朔修正表解压
//低精度定气朔计算(仍比古代日历精准很多)
function suo_low(W){ //低精度定朔计算,在2000年至600,误差在2小时以内
var v = 7771.37714500204;
var t = ( W + 1.08472 )/v, L;
t -= ( -0.0000331*t*t
+ 0.10976 *Math.cos( 0.785 + 8328.6914*t)
+ 0.02224 *Math.cos( 0.187 + 7214.0629*t)
- 0.03342 *Math.cos( 4.669 + 628.3076*t ) )/v
+ (32*(t+1.8)*(t+1.8)-20)/86400/36525;
return t*36525 + 8/24;
}
function qi_low(W){ //最大误差小于30分钟,平均5分
var t,L,v= 628.3319653318;
t = ( W - 4.895062166 )/v; //第一次估算,误差2天以内
t -= ( 53*t*t + 334116*Math.cos( 4.67+628.307585*t) + 2061*Math.cos( 2.678+628.3076*t)*t )/v/10000000; //第二次估算,误差2小时以内
L = 48950621.66 + 6283319653.318*t + 53*t*t //平黄经
+334166 * Math.cos( 4.669257+ 628.307585*t) //地球椭圆轨道级数展开
+3489 * Math.cos( 4.6261 + 1256.61517*t ) //地球椭圆轨道级数展开
+2060.6 * Math.cos( 2.67823 + 628.307585*t ) * t //一次泊松项
- 994 - 834*Math.sin(2.1824-33.75705*t); //光行差与章动修正
t -= (L/10000000 -W )/628.332 + (32*(t+1.8)*(t+1.8)-20)/86400/36525;
return t*36525 + 8/24;
}
function qi_high(W){ //较高精度气
var t = XL.S_aLon_t2(W)*36525;
t = t - JD.deltatT2(t);
var v = ( (t+0.5) %1 ) * 86400;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -