diff --git a/lunar.js b/lunar.js index cf79d9d..fbb46f4 100644 --- a/lunar.js +++ b/lunar.js @@ -435,7 +435,7 @@ o['dayZhiIndex'] = addDays%12; }; var _computeTime = function(o,hour,minute){ - var timeZhiIndex = LunarUtil.getTimeZhiIndex((hour<10?"0":"")+hour+":"+(minute<10?"0":"")+minute); + var timeZhiIndex = LunarUtil.getTimeZhiIndex((hour<10?'0':'')+hour+':'+(minute<10?'0':'')+minute); o['timeGanIndex'] = timeZhiIndex%10; o['timeZhiIndex'] = timeZhiIndex; }; @@ -1475,6 +1475,170 @@ } }; })(); + var HolidayUtil = (function(){ + var _SIZE = 18,_ZERO='0'.charCodeAt(0),_NAMES=['元旦节','春节','清明节','劳动节','端午节','中秋节','国庆节','国庆中秋','抗战胜利日'],_DATA='201101010120110101201101020120110101201101030120110101201101301020110203201102021120110203201102031120110203201102041120110203201102051120110203201102061120110203201102071120110203201102081120110203201102121020110203201104022020110405201104032120110405201104042120110405201104052120110405201104303120110501201105013120110501201105023120110501201106044120110606201106054120110606201106064120110606201109105120110912201109115120110912201109125120110912201110016120111001201110026120111001201110036120111001201110046120111001201110056120111001201110066120111001201110076120111001201110086020111001201110096020111001201112310020120101201201010120120101201201020120120101201201030120120101201201211020120123201201221120120123201201231120120123201201241120120123201201251120120123201201261120120123201201271120120123201201281120120123201201291020120123201203312020120404201204012020120404201204022120120404201204032120120404201204042120120404201204283020120501201204293120120501201204303120120501201205013120120501201205023020120501201206224120120623201206234120120623201206244120120623201209295020120930201209305120120930201210016120121001201210026120121001201210036120121001201210046120121001201210056120121001201210066120121001201210076120121001201210086020121001201301010120130101201301020120130101201301030120130101201301050020130101201301060020130101201302091120130210201302101120130210201302111120130210201302121120130210201302131120130210201302141120130210201302151120130210201302161020130210201302171020130210201304042120130404201304052120130404201304062120130404201304273020130501201304283020130501201304293120130501201304303120130501201305013120130501201306084020130612201306094020130612201306104120130612201306114120130612201306124120130612201309195120130919201309205120130919201309215120130919201309225020130919201309296020131001201310016120131001201310026120131001201310036120131001201310046120131001201310056120131001201310066120131001201310076120131001201401010120140101201401261020140131201401311120140131201402011120140131201402021120140131201402031120140131201402041120140131201402051120140131201402061120140131201402081020140131201404052120140405201404062120140405201404072120140405201405013120140501201405023120140501201405033120140501201405043020140501201405314120140602201406014120140602201406024120140602201409065120140908201409075120140908201409085120140908201409286020141001201410016120141001201410026120141001201410036120141001201410046120141004201410056120141001201410066120141001201410076120141001201410116020141001201501010120150101201501020120150101201501030120150101201501040020150101201502151020150219201502181120150219201502191120150219201502201120150219201502211120150219201502221120150219201502231120150219201502241120150219201502281020150219201504042120150405201504052120150405201504062120150405201505013120150501201505023120150501201505033120150501201506204120150620201506214120150620201506224120150620201509038120150903201509048120150903201509058120150903201509068020150903201509265120150927201509275120150927201510016120151001201510026120151001201510036120151001201510046120151004201510056120151001201510066120151001201510076120151001201510106020151001201601010120160101201601020120160101201601030120160101201602061020160208201602071120160208201602081120160208201602091120160208201602101120160208201602111120160208201602121120160208201602131120160208201602141020160208201604022120160404201604032120160404201604042120160404201604303120160501201605013120160501201605023120160501201606094120160609201606104120160609201606114120160609201606124020160609201609155120160915201609165120160915201609175120160915201609185020160915201610016120161001201610026120161001201610036120161001201610046120161004201610056120161001201610066120161001201610076120161001201610086020161001201610096020161001201612310120170101201701010120170101201701020120170101201701221020170128201701271120170128201701281120170128201701291120170128201701301120170128201701311120170128201702011120170128201702021120170128201702041020170128201704012020170404201704022120170404201704032120170404201704042120170404201704293120170501201704303120170501201705013120170501201705274020170530201705284120170530201705294120170530201705304120170530201709306020171001201710016120171001201710026120171001201710036120171001201710045120171004201710056120171001201710066120171001201710076120171001201710086120171001201712300120180101201712310120180101201801010120180101201802111020180216201802151120180216201802161120180216201802171120180216201802181120180216201802191120180216201802201120180216201802211120180216201802241020180216201804052120180405201804062120180405201804072120180405201804082020180405201804283020180501201804293120180501201804303120180501201805013120180501201806164120180618201806174120180618201806184120180618201809225120180924201809235120180924201809245120180924201809296020181001201809306020181001201810016120181001201810026120181001201810036120181001201810046120181001201810056120181001201810066120181001201810076120181001201812290020190101201812300120190101201812310120190101201901010120190101201902021020190205201902031020190205201902041120190205201902051120190205201902061120190205201902071120190205201902081120190205201902091120190205201902101120190205201904052120190405201904062120190405201904072120190405201904283020190501201905013120190501201905023120190501201905033120190501201905043120190501201905053020190501201906074120190607201906084120190607201906094120190607201909135120190913201909145120190913201909155120190913201909296020191001201910016120191001201910026120191001201910036120191001201910046120191001201910056120191001201910066120191001201910076120191001201910126020191001202001010120200101202001191020200125202001241120200125202001251120200125202001261120200125202001271120200125202001281120200125202001291120200125202001301120200125202001311120200125202002011120200125202002021120200125202004042120200404202004052120200404202004062120200404202004263020200501202005013120200501202005023120200501202005033120200501202005043120200501202005053120200501202005093020200501202006254120200625202006264120200625202006274120200625202006284020200625202009277020201001202010017120201001202010026120201001202010036120201001202010046120201001202010056120201001202010066120201001202010076120201001202010086120201001202010106020201001'; + var _padding = function(n){ + return (n<10?'0':'')+n; + }; + var _ymd = function(s){ + return s.indexOf('-')<0?(s.substr(0,4)+"-"+s.substr(4,2)+"-"+s.substr(6)):s; + }; + var _buildHoliday = function(day,name,work,target){ + return { + _p:{ + day:_ymd(day), + name:name, + work:work, + target:_ymd(target), + }, + getDay:function(){ + return this._p.day; + }, + setDay:function(v){ + this._p.day = _ymd(v); + }, + getName:function(){ + return this._p.name; + }, + setName:function(v){ + this._p.name = v; + }, + isWork:function(){ + return this._p.work; + }, + setWork:function(v){ + this._p.work = v; + }, + getTarget:function(){ + return this._p.target; + }, + setTarget:function(v){ + this._p.target = _ymd(v); + }, + toString:function(){ + return this._p.day+' '+this._p.name+(this._p.work?'调休':'')+' '+this._p.target; + } + }; + }; + var _buildHolidayForward = function(s){ + var day = s.substr(0,8); + var name = _NAMES[s.charCodeAt(8)-_ZERO]; + var work = s.charCodeAt(9)===_ZERO; + var target = s.substr(10,8); + return _buildHoliday(day,name,work,target); + }; + var _buildHolidayBackward = function(s){ + var size = s.length; + var day = s.substr(size-18,8); + var name = _NAMES[s.charCodeAt(size-10)-_ZERO]; + var work = s.charCodeAt(size-9)===_ZERO; + var target = s.substr(size-8); + return _buildHoliday(day,name,work,target); + }; + var _findForward = function(key){ + var start = _DATA.indexOf(key); + if(start<0) { + return null; + } + var right = _DATA.substr(start); + var n = right.length%_SIZE; + if(n>0){ + right = right.substr(n); + } + while((0!==right.indexOf(key))&&right.length>=_SIZE){ + right = right.substr(_SIZE); + } + return right; + }; + var _findBackward = function(key){ + var start = _DATA.lastIndexOf(key); + if(start<0) { + return null; + } + var keySize = key.length; + var left = _DATA.substr(0,start+keySize); + var size = left.length; + var n = size%_SIZE; + if(n>0){ + left = left.substr(0,size-n); + } + size = left.length; + while((size-keySize!==left.lastIndexOf(key))&&size>=_SIZE){ + left = left.substr(0,size-_SIZE); + size = left.length; + } + return left; + }; + var _findHolidaysForward = function(key){ + var l = []; + var s = _findForward(key); + if(null==s) { + return l; + } + while(0===s.indexOf(key)){ + l.push(_buildHolidayForward(s)); + s = s.substr(_SIZE); + } + return l; + }; + var _findHolidaysBackward = function(key){ + var l = []; + var s = _findBackward(key); + if(null==s) { + return l; + } + var size = s.length; + var keySize = key.length; + while(size-keySize===s.lastIndexOf(key)){ + l.push(_buildHolidayBackward(s)); + s = s.substring(0,size-_SIZE); + size = s.length; + } + l.reverse(); + return l; + }; + var _getHoliday = function(args){ + var l = []; + switch(args.length){ + case 1: + l = _findHolidaysForward(args[0].replace(/-/g,'')); + break; + case 3: + l = _findHolidaysForward(args[0]+_padding(args[1])+_padding(args[2])); + break; + } + return l.length<1?null:l[0]; + }; + var _getHolidays = function(args){ + var l = []; + switch(args.length){ + case 1: + l = _findHolidaysForward((args[0]+'').replace(/-/g,'')); + break; + case 2: + l = _findHolidaysForward(args[0]+_padding(args[1])); + break; + } + return l; + }; + var _getHolidaysByTarget = function(args){ + var l = []; + switch(args.length){ + case 1: + l = _findHolidaysBackward((args[0]+'').replace(/-/g,'')); + break; + case 3: + l = _findHolidaysBackward(args[0]+_padding(args[1])+_padding(args[2])); + break; + } + return l; + }; + return { + getHoliday:function(){return _getHoliday(arguments);}, + getHolidays:function(){return _getHolidays(arguments);}, + getHolidaysByTarget:function(){return _getHolidaysByTarget(arguments);} + }; + })(); W.SolarUtil = SolarUtil; W.LunarUtil = LunarUtil; W.Solar = Solar; @@ -1484,4 +1648,5 @@ W.SolarSeason = SolarSeason; W.SolarHalfYear = SolarHalfYear; W.SolarYear = SolarYear; + W.HolidayUtil = HolidayUtil; })(window);