(function(W){ var Solar = (function(){ var _fromDate = function(date){ return _fromYmdHm(date.getFullYear(),date.getMonth()+1,date.getDate(),date.getHours(),date.getMinutes()); }; var _fromYmdHm = function(y,m,d,hour,minute){ return { _p:{ year:y, month:m, day:d, hour:hour, minute:minute, calendar:new Date(y+'/'+m+'/'+d+' '+hour+':'+minute) }, getYear:function(){ return this._p.year; }, getMonth:function(){ return this._p.month; }, getDay:function(){ return this._p.day; }, getHour:function(){ return this._p.hour; }, getMinute:function(){ return this._p.minute; }, getWeek:function(){ return this._p.calendar.getDay(); }, getWeekInChinese:function(){ return SolarUtil.WEEK[this.getWeek()]; }, /** * 获取当天的阳历周 * @param start 星期几作为一周的开始,1234560分别代表星期一至星期天 */ getSolarWeek:function(start){ return SolarWeek.fromDate(this._p.calendar,start); }, isLeapYear:function(){ return SolarUtil.isLeapYear(this._p.year); }, getFestivals:function(){ var l = []; var f = SolarUtil.FESTIVAL[this._p.month+'-'+this._p.day]; if(f) l.push(f); var week = this.getWeek(); var weekInMonth = Math.ceil((this._p.day-week)/7); if(week>0) weekInMonth++; f = SolarUtil.WEEK_FESTIVAL[this._p.month+'-'+weekInMonth+'-'+week]; if(f) l.push(f); return l; }, getOtherFestivals:function(){ var l = []; var fs = SolarUtil.OTHER_FESTIVAL[this._p.month+'-'+this._p.day]; if(fs){ for(var i=0,j=fs.length;i=321&&y<=419) index = 0; else if(y>=420&&y<=520) index = 1; else if(y>=521&&y<=620) index = 2; else if(y>=621&&y<=722) index = 3; else if(y>=723&&y<=822) index = 4; else if(y>=823&&y<=922) index = 5; else if(y>=923&&y<=1022) index = 6; else if(y>=1023&&y<=1121) index = 7; else if(y>=1122&&y<=1221) index = 8; else if(y>=1222||y<=119) index = 9; else if(y<=218) index = 10; return SolarUtil.XINGZUO[index]; }, getXingZuo:function(){ return this.getXingzuo(); }, toString:function(){ return [this._p.year,(this._p.month<10?'0':'')+this._p.month,(this._p.day<10?'0':'')+this._p.day].join('-'); }, toFullString:function(){ var hour = (this._p.hour<10?'0':'')+this._p.hour; var minute = (this._p.minute<10?'0':'')+this._p.minute; var s = this.toString(); s += ' '+hour; s += ':'+minute; if(this.isLeapYear()){ s += ' 闰年'; } s += ' 星期'+this.getWeekInChinese(); var festivals = this.getFestivals(); for(var i=0,j=festivals.length;ilastDate){ lunarD -= lastDate; lunarM = LunarUtil.nextMonth(lunarY,lunarM); if(lunarM===1) lunarY++; lastDate = LunarUtil.getDaysOfMonth(lunarY,lunarM); } return _fromYmdHm(lunarY,lunarM,lunarD,hour,minute,solar); }; var _fromYmdHm = function(y,m,d,hour,minute,solar){ var dayOffset = LunarUtil.computeAddDays(y,m,d); var addDays = (dayOffset + LunarUtil.BASE_DAY_GANZHI_INDEX)%60; var dayGanIndex = addDays%10; var dayZhiIndex = addDays%12; var lunar = { _p:{ year:y, month:m, day:d, hour:hour, minute:minute, dayOffset:dayOffset, dayGanIndex:dayGanIndex, dayZhiIndex:dayZhiIndex, solar:null }, _toSolar:function(){ var y = LunarUtil.BASE_YEAR; var m = LunarUtil.BASE_MONTH; var d = LunarUtil.BASE_DAY; var diff = LunarUtil.getDaysOfMonth(y,m)-d; m = LunarUtil.nextMonth(y,m); while(true){ diff += LunarUtil.getDaysOfMonth(y,m); m = LunarUtil.nextMonth(y,m); if(m===1) y++; if(y===this._p.year&&m===this._p.month){ diff += this._p.day; break; } } var date = new Date(SolarUtil.BASE_YEAR+'/'+SolarUtil.BASE_MONTH+'/'+SolarUtil.BASE_DAY+' '+this._p.hour+':'+this._p.minute); date.setDate(date.getDate()+diff); return Solar.fromDate(date); }, getYear:function(){ return this._p.year; }, getMonth:function(){ return this._p.month; }, getDay:function(){ return this._p.day; }, getGan:function(){ return LunarUtil.GAN[(this._p.year-4)%10+1]; }, getZhi:function(){ return LunarUtil.ZHI[(this._p.year-4)%12+1]; }, getYearGan:function(){ return LunarUtil.GAN[(this._p.year-4)%10+1]; }, getYearZhi:function(){ return LunarUtil.ZHI[(this._p.year-4)%12+1]; }, getYearInGanZhi:function(){ return this.getYearGan()+this.getYearZhi(); }, getMonthGan:function(){ var m = Math.abs(this._p.month)-1; var yearGanIndex = (this._p.year-4)%10; var offset = (yearGanIndex%5+1)*2; return LunarUtil.GAN[(m+offset)%10+1]; }, getMonthZhi:function(){ var m = Math.abs(this._p.month)-1; return LunarUtil.ZHI[(m+LunarUtil.BASE_MONTH_ZHI_INDEX)%12+1]; }, getMonthInGanZhi:function(){ return this.getMonthGan()+this.getMonthZhi(); }, getDayGan:function(){ return LunarUtil.GAN[this._p.dayGanIndex+1]; }, getDayZhi:function(){ return LunarUtil.ZHI[this._p.dayZhiIndex+1]; }, getDayInGanZhi:function(){ return this.getDayGan()+this.getDayZhi(); }, getTimeGan:function(){ var zhi = this.getTimeZhi(); for(var i=1,j=LunarUtil.ZHI.length;i0){ return LunarUtil.MONTH[month]; }else{ return '闰'+LunarUtil.MONTH[-month]; } }, getDayInChinese:function(){ return LunarUtil.DAY[this._p.day]; }, getPengZuGan:function(){ return LunarUtil.PENGZU_GAN[this._p.dayGanIndex+1]; }, getPengZuZhi:function(){ return LunarUtil.PENGZU_ZHI[this._p.dayZhiIndex+1]; }, getPositionXi:function(){ return LunarUtil.POSITION_XI[this._p.dayGanIndex+1]; }, getPositionXiDesc:function(){ return LunarUtil.POSITION_DESC[this.getPositionXi()]; }, getPositionYangGui:function(){ return LunarUtil.POSITION_YANG_GUI[this._p.dayGanIndex+1]; }, getPositionYangGuiDesc:function(){ return LunarUtil.POSITION_DESC[this.getPositionYangGui()]; }, getPositionYinGui:function(){ return LunarUtil.POSITION_YIN_GUI[this._p.dayGanIndex+1]; }, getPositionYinGuiDesc:function(){ return LunarUtil.POSITION_DESC[this.getPositionYinGui()]; }, getPositionFu:function(){ return LunarUtil.POSITION_FU[this._p.dayGanIndex+1]; }, getPositionFuDesc:function(){ return LunarUtil.POSITION_DESC[this.getPositionFu()]; }, getPositionCai:function(){ return LunarUtil.POSITION_CAI[this._p.dayGanIndex+1]; }, getPositionCaiDesc:function(){ return LunarUtil.POSITION_DESC[this.getPositionCai()]; }, getChong:function(){ return LunarUtil.CHONG[this.getDayZhi()]; }, getChongGan:function(){ return LunarUtil.CHONG_GAN[this.getDayGan()]; }, getChongGanTie:function(){ return LunarUtil.CHONG_GAN_TIE[this.getDayGan()]; }, getChongShengXiao:function(){ var chong = this.getChong(); for(var i=0,j=LunarUtil.ZHI.length;i=LunarUtil.JIE_YEAR[solarMonth-1][index]){ index++; } var term = LunarUtil.JIE_MAP[solarMonth-1][4*index+ry%4]; if(ry===121&&solarMonth===4) term = 5; if(ry===132&&solarMonth===4) term = 5; if(ry===194&&solarMonth===6) term = 6; if(solarDay===term) s = LunarUtil.JIE[solarMonth-1]; return s; }, getQi:function(){ var s = '',solar = this._p.solar; var solarYear = solar.getYear(); var solarMonth = solar.getMonth(); var solarDay = solar.getDay(); var index = 0; var ry = solarYear-SolarUtil.BASE_YEAR+1; while(ry>=LunarUtil.QI_YEAR[solarMonth-1][index]){ index++; } var term = LunarUtil.QI_MAP[solarMonth-1][4*index+ry%4]; if(ry===171&&solarMonth===3) term = 21; if(ry===181&&solarMonth===5) term = 21; if(solarDay===term) s = LunarUtil.QI[solarMonth-1]; return s; }, getWeek:function(){ return (this._p.dayOffset+LunarUtil.BASE_WEEK_INDEX)%7; }, getWeekInChinese:function(){ return SolarUtil.WEEK[this.getWeek()]; }, getXiu:function(){ return LunarUtil.XIU[this.getDayZhi()+this.getWeek()]; }, getXiuLuck:function(){ return LunarUtil.XIU_LUCK[this.getXiu()]; }, getXiuSong:function(){ return LunarUtil.XIU_SONG[this.getXiu()]; }, getZheng:function(){ return LunarUtil.ZHENG[this.getXiu()]; }, getAnimal:function(){ return LunarUtil.ANIMAL[this.getXiu()]; }, getGong:function(){ return LunarUtil.GONG[this.getXiu()]; }, getShou:function(){ return LunarUtil.SHOU[this.getGong()]; }, getFestivals:function(){ var l = []; var f = LunarUtil.FESTIVAL[this._p.month+'-'+this._p.day]; if(f) l.push(f); return l; }, getOtherFestivals:function(){ var l = []; var fs = LunarUtil.OTHER_FESTIVAL[this._p.month+'-'+this._p.day]; if(fs){ for(var i=0,j=fs.length;i0){ s += ' ['+jq+']'; } s += ' '+this.getGong()+'方'+this.getShou(); s += ' 星宿['+this.getXiu()+this.getZheng()+this.getAnimal()+']('+this.getXiuLuck()+')'; s += ' 彭祖百忌['+this.getPengZuGan()+' '+this.getPengZuZhi()+']'; s += ' 喜神方位['+this.getPositionXi()+']('+this.getPositionXiDesc()+')'; s += ' 阳贵神方位['+this.getPositionYangGui()+']('+this.getPositionYangGuiDesc()+')'; s += ' 阴贵神方位['+this.getPositionYinGui()+']('+this.getPositionYinGuiDesc()+')'; s += ' 福神方位['+this.getPositionFu()+']('+this.getPositionFuDesc()+')'; s += ' 财神方位['+this.getPositionCai()+']('+this.getPositionCaiDesc()+')'; s += ' 冲['+this.getChongDesc()+']'; s += ' 煞['+this.getSha()+']'; return s; } }; lunar._p.solar = solar?solar:lunar._toSolar(); return lunar; }; return { fromYmdHm:function(y,m,d,hour,minute){return _fromYmdHm(y,m,d,hour,minute);}, fromYmd:function(y,m,d){return _fromYmdHm(y,m,d,0,0);}, fromDate:function(date){return _fromDate(date);} }; })(); var SolarWeek = (function(){ var _fromDate = function(date,start){ return _fromYmd(date.getFullYear(),date.getMonth()+1,date.getDate(),start); }; var _fromYmd = function(y,m,d,start){ return { _p:{ year:y, month:m, day:d, start:start, calendar:new Date(y+'/'+m+'/'+d) }, getYear:function(){ return this._p.year; }, getMonth:function(){ return this._p.month; }, getDay:function(){ return this._p.day; }, getStart:function(){ return this._p.start; }, /** * 获取当前日期是在当月第几周 * @return number 周序号,从1开始 */ getIndex:function(){ var firstDate = new Date(this._p.year+'/'+this._p.month+'/1'); var firstDayWeek = firstDate.getDay(); return Math.ceil((this._p.day+firstDayWeek-this._p.start)/7); }, /** * 周推移 * @param weeks 推移的周数,负数为倒推 * @param separateMonth 是否按月单独计算 * @return object 推移后的阳历周 */ next:function(weeks,separateMonth){ if(0===weeks){ return _fromYmd(this._p.year,this._p.month,this._p.day,this._p.start); } var date; if(separateMonth){ var n = weeks; date = new Date(this._p.year+'/'+this._p.month+'/'+this._p.day); var week = _fromDate(date,this._p.start); var month = this._p.month; var plus = n>0; while(0!==n){ date.setDate(date.getDate()+(plus?7:-7)); week = _fromDate(date,this._p.start); var weekMonth = week.getMonth(); if(month!==weekMonth){ var index = week.getIndex(); if(plus){ if(1===index){ var firstDay = week.getFirstDay(); week = _fromYmd(firstDay.getYear(),firstDay.getMonth(),firstDay.getDay(),this._p.start); weekMonth = week.getMonth(); }else{ date = new Date(week.getYear()+'/'+week.getMonth()+'/1'); week = _fromDate(date,this._p.start); } }else{ var size = SolarUtil.getWeeksOfMonth(week.getYear(),week.getMonth(),this._p.start); if(size===index){ var lastDay = week.getFirstDay().next(6); week = _fromYmd(lastDay.getYear(),lastDay.getMonth(),lastDay.getDay(),this._p.start); weekMonth = week.getMonth(); }else{ date = new Date(week.getYear()+'/'+week.getMonth()+'/'+SolarUtil.getDaysOfMonth(week.getYear(),week.getMonth())); week = _fromDate(date,this._p.start); } } month = weekMonth; } n-=plus?1:-1; } return week; }else{ date = new Date(this._p.year+'/'+this._p.month+'/'+this._p.day); date.setDate(date.getDate()+weeks*7); return _fromDate(date,this._p.start); } }, /** * 获取本周第一天的阳历日期(可能跨月) * @return object 本周第一天的阳历日期 */ getFirstDay:function(){ var date = new Date(this._p.year+'/'+this._p.month+'/'+this._p.day); var week = date.getDay(); var prev = week-this._p.start; if(prev<0){ prev += 7; } date.setDate(date.getDate()-prev); return Solar.fromDate(date); }, /** * 获取本周第一天的阳历日期(仅限当月) * @return object 本周第一天的阳历日期 */ getFirstDayInMonth:function(){ var days = this.getDays(); for(var i = 0;i0){ var index = y-this.BASE_YEAR+this.BASE_INDEX; var v = this.LUNAR_MONTH[2*index+1]; v = (v>>4)&0x0F; if(v===m){ n = -m; } } if(n===13) n = 1; return n; }, getDaysOfMonth:function(year,month){ var index = year-this.BASE_YEAR+this.BASE_INDEX; var v = 0,l = 0,d = 30; if(1<=month&&month<=8){ v = this.LUNAR_MONTH[2*index]; l = month-1; if(((v>>l)&0x01)===1){ d = 29; } }else if(9<=month&&month<=12){ v = this.LUNAR_MONTH[2*index+1]; l = month-9; if(((v>>l)&0x01)===1){ d = 29; } }else{ v = this.LUNAR_MONTH[2*index+1]; v = (v>>4)&0x0F; if(v!==Math.abs(month)){ d = 0; }else{ d = 29; for(var i = 0;i5){ hm = hm.substring(0,5); } var x = 2; for(var i=1;i<22;i+=2){ if(hm>=((i<10?"0":"")+i+":00")&&hm<=((i+1<10?"0":"")+(i+1)+":59")){ return this.ZHI[x]; } x++; } return this.ZHI[1]; } }; })(); W.SolarUtil = SolarUtil; W.LunarUtil = LunarUtil; W.Solar = Solar; W.Lunar = Lunar; W.SolarWeek = SolarWeek; W.SolarMonth = SolarMonth; W.SolarSeason = SolarSeason; W.SolarHalfYear = SolarHalfYear; W.SolarYear = SolarYear; })(window);