?? 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 + -