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