?? lunar.js
字號:
/**************************
壽星萬年歷中日對象的標準定義
假設日對象的數據結構為ob
·日的公歷信息
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.Hyear 年(回歷)
ob.Hmonth 月(回歷)
ob.Hday 日(回歷)
·日的其它信息
ob.yxmc 月相名稱
ob.yxjd 月相時刻(儒略日)
ob.yxsj 月相時間串
ob.jqmc 節氣名稱
ob.jqjd 節氣時刻(儒略日)
ob.jqsj 節氣時間串
*****************************/
/*****************************
壽星萬年歷中月對象的數據結構定義
假設月對象的名稱為lun
lun.w0 本月第一天的星期
lun.y 公歷年份
lun.m 公歷月分
lun.d0 月首的J2000.0起算的儒略日數
lun.dn 本月的天數
lun.Ly 該年的干支紀年
lun.ShX 該年的生肖
lun[0] 該月第1天(日對象)
lun[1] 該月第2天(日對象)
……
/******************************
/******************************
以下程序嚴格尊守以上規范,即創建的月(或日)對象,必含以上數據結構內容。壽星萬年歷通過Lunar類件得到月對象
月或月對象的數據結構的擴充:例如調用oba.getDayName(ob,ob),可擴展ob對象的“節日信息”,返回值在ob.A、ob.B、ob.C中
根據某些需要,用戶還可以自行擴展ob
******************************/
//=============================
//公歷基礎構件,JD物件的補充
//public中定義的成員可以直接使用
//=============================
var oba={ //公歷基礎構件
//private私有成員定義
wFtv : new Array( //某月的第幾個星期幾,如第2個星期一指從月首開始順序找到第2個“星期一”
'0150I世界麻風日', //一月的最后一個星期日(月倒數第一個星期日)
'0520.國際母親節',
'0530I全國助殘日',
'0630.父親節',
'0730.被奴役國家周',
'0932I國際和平日',
'0940.國際聾人節 世界兒童日',
'0950I世界海事日',
'1011.國際住房日',
'1013I國際減輕自然災害日(減災日)',
'1144I感恩節'
),
sFtv : '', //假日表,由init初始化
//public公有成員定義
init:function(){ //初始化
var i;
//紀年數據結構:數據用逗號分開,每7個描述一個年號,格式為:起始公元,使用年數,已用年數,朝代,朝號,皇帝,年號
var s = //國歷節日,#表示放假日,I表示重要節日或紀念日
'01#元旦|' //1月
+'02I世界濕地日,10.國際氣象節,14I情人節|' //2月
+'01.國際海豹日,03.全國愛耳日,05.1963-9999學雷鋒紀念日,08I婦女節,12I植樹節,12.1925-9999孫中山逝世紀念日,14.國際警察日,' //3月
+'15I1983-9999消費者權益日,17.中國國醫節,17.國際航海日,21.世界森林日,21.消除種族歧視國際日,21.世界兒歌日,22I世界水日,'
+'23I世界氣象日,24.1982-9999世界防治結核病日,25.全國中小學生安全教育日,30.巴勒斯坦國土日|'
+'01I1564-9999愚人節,01.全國愛國衛生運動月(四月),01.稅收宣傳月(四月),07I世界衛生日,22I世界地球日,23.世界圖書和版權日,24.亞非新聞工作者日|' //4月
+'01#1889-9999勞動節,04I青年節,05.碘缺乏病防治日,08.世界紅十字日,12I國際護士節,15I國際家庭日,17.國際電信日,18.國際博物館日,' //5月
+'20.全國學生營養日,23.國際牛奶日,31I世界無煙日|'
+'01I1925-9999國際兒童節,05.世界環境保護日,06.全國愛眼日,17.防治荒漠化和干旱日,23.國際奧林匹克日,25.全國土地日,26I國際禁毒日|' //6月
+'01I1997-9999香港回歸紀念日,01I1921-9999中共誕辰,01.世界建筑日,02.國際體育記者日,07I1937-9999抗日戰爭紀念日,11I世界人口日,30.非洲婦女日|' //7月
+'01I1927-9999建軍節,08.中國男子節(爸爸節),15I1945-9999抗日戰爭勝利紀念|' //8月
+'08.1966-9999國際掃盲日,08.國際新聞工作者日,09.毛澤東逝世紀念,10I中國教師節,14.世界清潔地球日,' //9月
+'16.國際臭氧層保護日,18I九·一八事變紀念日,20.國際愛牙日,27.世界旅游日,28I孔子誕辰|'
+'01#1949-9999國慶節,01.世界音樂日,01.國際老人節,02#1949-9999國慶節假日,02.國際和平與民主自由斗爭日,03#1949-9999國慶節假日,' //10月
+'04.世界動物日,06.老人節,08.全國高血壓日,08.世界視覺日,09.世界郵政日,09.萬國郵聯日,10I辛亥革命紀念日,10.世界精神衛生日,'
+'13.世界保健日,13.國際教師節,14.世界標準日,15.國際盲人節(白手杖節),16.世界糧食日,17.世界消除貧困日,22.世界傳統醫藥日,24.聯合國日,31.世界勤儉日|'
+'07.1917-9999十月社會主義革命紀念日,08.中國記者日,09.全國消防安全宣傳教育日,10.世界青年節,11.國際科學與和平周(本日所屬的一周),12.孫中山誕辰紀念日,'
+'14.世界糖尿病日,17.國際大學生節,17.世界學生節,20.彝族年,21.彝族年,21.世界問候日,21.世界電視日,22.彝族年,29.國際聲援巴勒斯坦人民國際日|' //11月
+'01I1988-9999世界艾滋病日,03.世界殘疾人日,05.國際經濟和社會發展志愿人員日,08.國際兒童電視日,09.世界足球日,10.世界人權日,' //12月
+'12I西安事變紀念日,13I南京大屠殺(1937年)紀念日,20.澳門回歸紀念,21.國際籃球日,24I平安夜,25I圣誕節,26.毛澤東誕辰紀念';
this.sFtv=s.split('|');
for(i=0;i<this.sFtv.length;i++) this.sFtv[i]=this.sFtv[i].split(',');
},
getDayName:function(u,r){ //取某日節日,傳入日對象
/****************
節日名稱生成
傳入日物件u
返回某日節日信息
r.A 重要喜慶日子名稱(可將日子名稱置紅)
r.B 重要日子名稱
r.C 各種日子名稱(連成一大串)
r.Fjia 放假日子(可用于日期數字置紅)
*****************/
var m0=(u.m<10?'0':'')+u.m;
var d0=(u.d<10?'0':'')+u.d;
var i,j,s,s2,type;
if(u.week==0||u.week==6) r.Fjia = 1; //星期日或星期六放假
//按公歷日期查找
for(i=0;i<this.sFtv[u.m-1].length;i++){ //公歷節日或紀念日,遍歷本月節日表
s=this.sFtv[u.m-1][i];
if(s.substr(0,2)!=d0) continue;
s = s.substr(2,s.length-2);
type=s.substr(0,1);
if(s.substr(5,1)=='-'){ //有年限的
if( u.y<(s.substr(1,4)-0) || u.y>(s.substr(6,4)-0) ) continue;
s = s.substr(10,s.length-10);
} else {
if(u.y<1850) continue;
s = s.substr(1,s.length-1);
}
if(type=='#') r.A += s + ' ', r.Fjia = 1; //放假的節日
if(type=='I') r.B += s + ' '; //主要
if(type=='.') r.C += s + ' '; //其它
}
//按周查找
var w=u.weeki; if(u.week>=u.week0) w+=1;
var w2=w; if(u.weeki==u.weekN-1) w2=5;
w = m0 + w + u.week; //d日在本月的第幾個星期某
w2= m0 + w2 + u.week;
for(i=0;i<this.wFtv.length;i++){
s=this.wFtv[i];
s2=s.substr(0,4);
if(s2!=w && s2!=w2) continue;
type=s.substr(4,1);
s = s.substr(5,s.length-5);
if(type=='#') r.A += s + ' ', r.Fjia = 1;
if(type=='I') r.B += s +' ';
if(type=='.') r.C += s + ' ';
}
},
getHuiLi:function(d0,r){ //回歷計算
//以下算法使用Excel測試得到,測試時主要關心年臨界與月臨界
var z,y,m,d;
d = d0 + 503105; z = int2((d+0.1)/10631); //10631為一周期(30年)
d -= z*10631; y = int2((d+0.5)/354.366); //加0.5的作用是保證閏年正確(一周中的閏年是第2,5,7,10,13,16,18,21,24,26,29年)
d -= int2(y*354.366+0.5); m = int2((d+0.11)/29.51); //分子加0.11,分每加0.01的作用是第354或355天的的月分保持為12月(m=11)
d -= int2(m*29.51+0.5);
r.Hyear = z*30+y+1;
r.Hmonth= m+1;
r.Hday = d+1;
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -