Java编写多功能万年历程序的实例分享
这里的万年历制作主要用到了Calendar类和GregorianCalendar类,我们先来回顾一下基础知识:
基础部分
一、Calendar类。
1,主要字段:
YEAR(年份)、MONTH(月份从0开始)、DATE(一月的某天)、HOUR(指示上午或下午的小时)、HOUR_F_DAY(指示一天中的小时。)、DAY_OF_WEEK(一个星期中的某天)、DAY_OF_MONTH(一个月中的某天)、DAY_OF_YEAR(一年中的某天)、DAY_OF_WEEK_IN_MONTH(一个月中的第几个星期)、WEEK_OF_MONTH (指示当前月中的星期数)、WEEK_OF_YEAR(指示当前年中的星期数)
2,得Calendar类对象。
//通过Calendar类的静态方法getInstance获得。 Calendarca=Calendar.getInstance();
3,主要方法
voidset(intfield,intvalue)//field日历类的参数,比如YEARMONTHDATE等... voidset(intyear,intmonth,intdate)//设置年月日。 voidset(intyear,intmonth,intdate,inthourOfDay,intminute)//设置年月日时分 voidset(intyear,intmonth,intdate,inthourOfDay,intminute,intsecond)//设置年月日时分秒 voidsetTime(Datedate);//使用给定的Date设置此Calendar的时间。 intget(intfield)//返回给定日历字段的值。如:intmonth=acobj.get(Calendar.MONTH); DategetTime()//返回一个表示此Calendar时间值的Date对象。 longgetTimeInMillis()//返回从1970.1.100:00:00到该日历的毫秒数。 voidadd(intfield,amont);//根据日历的规则,为给定的日历字段添加或减去指定的时间量。可加减。如:caobj.add(Calendar.MONTH,1)下一个月。
二、GregorianCalendar类。
1,获得该类对象
Calendarca=newGregorianCalendar()//默认当前的时刻。 Calendarca=newGregorianCanlendar(intyear,intmonth,intdayOfMonth)//初始具有指定年月日的公历类对象。 Calendarca=newGregorianCanlendar(intyear,intmonth,intdayOfMonth,inthourOfDay,intminute)初始具有指定年月日的公历类对象。 Calendarca=newGregorianCanlendar(intyear,intmonth,intdayOfMonth,inthourOfDay,intminute,intsecond)//初始具有指定年月日的公历类对象。 上边的都是获得默认的语言环境,和默认的时区对象。
2,用法
用法主要继承去父类Calendar。
实例部分
三、万年历代码
packagecom.via.mce.monthcalendar.utils; importjava.util.Calendar; importjava.util.Date; importjava.util.GregorianCalendar; importjava.util.HashMap; /** *农历日历。<br> *将农历从1901年到2100年之间各年、月的大小以及历年节气保存,然后基于这些数据进行计算。<br> *<br> *新增了几个用于农历的常量属性字段,可以使用get()方法获取日历对应的值;<br> *农历年、月、日还可以使用set()/add()/roll()方法设置,其他农历属性自动计算;<br> *另外,还提供了getChinese(intfield)方法用于获得农历的中文文字(仅适用于农历属性和星期)。<br> *<ul> *<li>CHINESE_YEAR-农历年</li> *<li>CHINESE_MONTH-农历月</li> *<li>CHINESE_DATE-农历日</li> *<li>CHINESE_SECTIONAL_TERM-当月的节气</li> *<li>CHINESE_PRINCIPLE_TERM-当月的中气</li> *<li>CHINESE_HEAVENLY_STEM-农历年的天干</li> *<li>CHINESE_EARTHLY_BRANCH-农历年的地支</li> *<li>CHINESE_ZODIAC-农历年的属相</li> *<li>CHINESE_TERM_OR_DATE-如果当天存在一个节气则指示节气,否则如果当天是初一则指示农历月,否则指示农历日</li> *</ul> *注意:<br> *由于Calendar类的设定,公历月份从0起始。所有方法都遵循了这一约定。<br> *但所有的农历属性从1起始。即使是在Calendar提供的方法中,农历月也是从1起始的,并以负数表示闰月。<br> *clear()方法在某些情况下会导致农历和公历日期不对应或是不能达到预期的重置效果,应尽量避免使用。<br> *使用getSimpleDateString()获得公历日期字符串时,公历月已经修正;<br> *使用getSimpleChineseDateString()获得农历日期字符串时,农历闰月以*表示。<br> * *@version0.122011-9-5<br> *<blockquote>修复一个当使用农历正月日期初始化日历时陷入死循环的问题。</blockquote> *@version0.112009-12-27<br> *<blockquote>修复了获取中文农历时未计算农历日期的问题;<br> *加入一个字段CHINESE_TERM_OR_DATE用于模仿台历的显示方式:如果当天有节气则指示节气,如果是初一指示农历月, *否则指示农历日。</blockquote> *@version0.102009-12-22 */ publicfinalclassChineseCalendarextendsGregorianCalendar{ privatestaticfinallongserialVersionUID=8L; /**农历年*/ publicstaticfinalintCHINESE_YEAR=801; /**农历月*/ publicstaticfinalintCHINESE_MONTH=802; /**农历日*/ publicstaticfinalintCHINESE_DATE=803; /**当月的节气对应的公历日(前一个节气)*/ publicstaticfinalintCHINESE_SECTIONAL_TERM=804; /**当月的中气对应的公历日(后一个节气)*/ publicstaticfinalintCHINESE_PRINCIPLE_TERM=805; /**天干*/ publicstaticfinalintCHINESE_HEAVENLY_STEM=806; /**地支*/ publicstaticfinalintCHINESE_EARTHLY_BRANCH=807; /**农历年的属相(生肖)*/ publicstaticfinalintCHINESE_ZODIAC=808; /**节气或者农历日*/ publicstaticfinalintCHINESE_TERM_OR_DATE=888; //addbyskywang /**农历节日*/ publicstaticfinalintLUNAR_FESTIVAL=809; /**阳历节日*/ publicstaticfinalintSOLAR_FESTIVAL=810; /**节气*/ publicstaticfinalintCHINESE_TERM=811; /**月或者农历日*/ publicstaticfinalintCHINESE_MONTH_OR_DATE=812; /**节日或节气或农历日*/ publicstaticfinalintFESTIVAL_OR_TERM_OR_DATE=813; privateintchineseYear; privateintchineseMonth;//1起始,负数表示闰月 privateintchineseDate; privateintsectionalTerm;//当月节气的公历日 privateintprincipleTerm;//当月中气的公历日 privatebooleanareChineseFieldsComputed;//农历日期是否已经经过计算确认 privatebooleanareSolarTermsComputed;//节气是否已经经过计算确认 privatebooleanlastSetChinese;//最后设置的是不是农历属性 /**使用当前时间构造一个实例。*/ publicChineseCalendar(){ super(); } /**使用指定时间构造一个实例。*/ publicChineseCalendar(Dated){ super.setTime(d); } /**使用指定时间构造一个实例。*/ publicChineseCalendar(Calendarc){ this(c.getTime()); } /**使用指定公历日期构造一个实例。*/ publicChineseCalendar(inty,intm,intd){ super(y,m,d); } /** *使用指定日期构造一个实例。 * *@paramisChinese *是否为农历日期 *@paramy *@paramm *@paramd */ publicChineseCalendar(booleanisChinese,inty,intm,intd){ if(isChinese){ set(CHINESE_YEAR,y); set(CHINESE_MONTH,m); set(CHINESE_DATE,d); }else{ set(y,m,d); } } publicvoidset(intfield,intvalue){ computeIfNeed(field); if(isChineseField(field)){ //农历属性 switch(field){ caseCHINESE_YEAR: chineseYear=value; break; caseCHINESE_MONTH: chineseMonth=value; break; caseCHINESE_DATE: chineseDate=value; break; default: thrownewIllegalArgumentException("不支持的field设置:"+field); } lastSetChinese=true; }else{ //非农历属性 super.set(field,value); lastSetChinese=false; } areFieldsSet=false; areChineseFieldsComputed=false; areSolarTermsComputed=false; } publicintget(intfield){ computeIfNeed(field); if(!isChineseField(field)){ returnsuper.get(field); } switch(field){ caseCHINESE_YEAR: returnchineseYear; caseCHINESE_MONTH: returnchineseMonth; caseCHINESE_DATE: returnchineseDate; caseCHINESE_SECTIONAL_TERM: returnsectionalTerm; caseCHINESE_PRINCIPLE_TERM: returnprincipleTerm; caseCHINESE_HEAVENLY_STEM: return(chineseYear-4)%10+1; caseCHINESE_EARTHLY_BRANCH: caseCHINESE_ZODIAC: return(chineseYear-4)%12+1; caseCHINESE_MONTH_OR_DATE: if(get(CHINESE_DATE)==1){ returnCHINESE_MONTH; }else{ returnCHINESE_DATE; } caseCHINESE_TERM_OR_DATE: intoption; if(get(Calendar.DATE)==get(CHINESE_SECTIONAL_TERM)){ option=CHINESE_SECTIONAL_TERM; }elseif(get(Calendar.DATE)==get(CHINESE_PRINCIPLE_TERM)){ option=CHINESE_PRINCIPLE_TERM; }elseif(get(CHINESE_DATE)==1){ option=CHINESE_MONTH; }else{ option=CHINESE_DATE; } returnoption; default: thrownewIllegalArgumentException("不支持的field获取:"+field); } } publicvoidadd(intfield,intamount){ computeIfNeed(field); if(!isChineseField(field)){ super.add(field,amount); lastSetChinese=false; areChineseFieldsComputed=false; areSolarTermsComputed=false; return; } switch(field){ caseCHINESE_YEAR: chineseYear+=amount; break; caseCHINESE_MONTH: for(inti=0;i<amount;i++){ chineseMonth=nextChineseMonth(chineseYear,chineseMonth); if(chineseMonth==1){ chineseYear++; } } break; caseCHINESE_DATE: intmaxDate=daysInChineseMonth(chineseYear,chineseMonth); for(inti=0;i<amount;i++){ chineseDate++; if(chineseDate>maxDate){ chineseDate=1; chineseMonth=nextChineseMonth(chineseYear,chineseMonth); if(chineseMonth==1){ chineseYear++; } maxDate=daysInChineseMonth(chineseYear,chineseMonth); } } default: thrownewIllegalArgumentException("不支持的field:"+field); } lastSetChinese=true; areFieldsSet=false; areChineseFieldsComputed=false; areSolarTermsComputed=false; } publicvoidroll(intfield,intamount){ computeIfNeed(field); if(!isChineseField(field)){ super.roll(field,amount); lastSetChinese=false; areChineseFieldsComputed=false; areSolarTermsComputed=false; return; } switch(field){ caseCHINESE_YEAR: chineseYear+=amount; break; caseCHINESE_MONTH: for(inti=0;i<amount;i++){ chineseMonth=nextChineseMonth(chineseYear,chineseMonth); } break; caseCHINESE_DATE: intmaxDate=daysInChineseMonth(chineseYear,chineseMonth); for(inti=0;i<amount;i++){ chineseDate++; if(chineseDate>maxDate){ chineseDate=1; } } default: thrownewIllegalArgumentException("不支持的field:"+field); } lastSetChinese=true; areFieldsSet=false; areChineseFieldsComputed=false; areSolarTermsComputed=false; } /** *获得属性的中文,可以使用的属性字段为DAY_OF_WEEK以及所有农历属性字段。 * *@paramfield *@return */ publicStringgetChinese(intfield){ computeIfNeed(field); switch(field){ caseCHINESE_YEAR: returngetChinese(CHINESE_HEAVENLY_STEM) +getChinese(CHINESE_EARTHLY_BRANCH)+"年"; caseCHINESE_MONTH: if(chineseMonth>0) returnchineseMonthNames[chineseMonth]+"月"; else return"闰"+chineseMonthNames[-chineseMonth]+"月"; caseCHINESE_DATE: returnchineseDateNames[chineseDate]; caseCHINESE_SECTIONAL_TERM: returnsectionalTermNames[get(Calendar.MONTH)]; caseCHINESE_PRINCIPLE_TERM: returnprincipleTermNames[get(Calendar.MONTH)]; caseCHINESE_HEAVENLY_STEM: returnstemNames[get(field)]; caseCHINESE_EARTHLY_BRANCH: returnbranchNames[get(field)]; caseCHINESE_ZODIAC: returnanimalNames[get(field)]; caseCalendar.DAY_OF_WEEK: returnchineseWeekNames[get(field)]; caseCHINESE_TERM_OR_DATE: returngetChinese(get(CHINESE_TERM_OR_DATE)); caseLUNAR_FESTIVAL: returngetLunarFestival(); caseSOLAR_FESTIVAL: returngetSolarFestival(); caseFESTIVAL_OR_TERM_OR_DATE: returngetFestivalOrTermOrDate(); //TODOCHECK caseCHINESE_MONTH_OR_DATE: returngetChinese(get(CHINESE_MONTH_OR_DATE)); caseCHINESE_TERM: returngetChineseTerm(); default: thrownewIllegalArgumentException("不支持的field中文获取:"+field); } } publicStringgetSimpleGregorianDateString(){ returnnewStringBuffer().append(get(YEAR)).append("-") .append(get(MONTH)+1).append("-").append(get(DATE)) .toString(); } publicStringgetSimpleChineseDateString(){ returnnewStringBuffer() .append(get(CHINESE_YEAR)) .append("-") .append(get(CHINESE_MONTH)>0?""+get(CHINESE_MONTH):"*" +(-get(CHINESE_MONTH))).append("-") .append(get(CHINESE_DATE)).toString(); } publicStringgetChineseDateString(){ returnnewStringBuffer().append(getChinese(CHINESE_YEAR)) .append(getChinese(CHINESE_MONTH)) .append(getChinese(CHINESE_DATE)).toString(); } publicStringtoString(){ StringBufferbuf=newStringBuffer(); buf.append(getSimpleGregorianDateString()).append("|") .append(getChinese(DAY_OF_WEEK)).append("|[农历]") .append(getChineseDateString()).append("") .append(getChinese(CHINESE_ZODIAC)).append("年") .append(get(CHINESE_SECTIONAL_TERM)).append("日") .append(getChinese(CHINESE_SECTIONAL_TERM)).append("") .append(get(CHINESE_PRINCIPLE_TERM)).append("日") .append(getChinese(CHINESE_PRINCIPLE_TERM)); returnbuf.toString(); } /** *判断是不是农历属性 * *@paramfield *@return */ privatebooleanisChineseField(intfield){ switch(field){ caseCHINESE_YEAR: caseCHINESE_MONTH: caseCHINESE_DATE: caseCHINESE_SECTIONAL_TERM: caseCHINESE_PRINCIPLE_TERM: caseCHINESE_HEAVENLY_STEM: caseCHINESE_EARTHLY_BRANCH: caseCHINESE_ZODIAC: caseCHINESE_TERM_OR_DATE: caseCHINESE_MONTH_OR_DATE: returntrue; default: returnfalse; } } /** *判断是不是与节气有关的属性 * *@paramfield *@return */ privatebooleanisChineseTermsField(intfield){ switch(field){ caseCHINESE_SECTIONAL_TERM: caseCHINESE_PRINCIPLE_TERM: caseCHINESE_TERM_OR_DATE: returntrue; default: returnfalse; } } /** *如果上一次设置的与这次将要设置或获取的属性不是同一类(农历/公历),<br> *例如上一次设置的是农历而现在要设置或获取公历,<br> *则需要先根据之前设置的农历日期计算出公历日期。 * *@paramfield */ privatevoidcomputeIfNeed(intfield){ if(isChineseField(field)){ if(!lastSetChinese&&!areChineseFieldsComputed){ super.complete(); computeChineseFields(); areFieldsSet=true; areChineseFieldsComputed=true; areSolarTermsComputed=false; } if(isChineseTermsField(field)&&!areSolarTermsComputed){ computeSolarTerms(); areSolarTermsComputed=true; } }else{ if(lastSetChinese&&!areFieldsSet){ computeGregorianFields(); super.complete(); areFieldsSet=true; areChineseFieldsComputed=true; areSolarTermsComputed=false; } } } /** *使用农历日期计算出公历日期 */ privatevoidcomputeGregorianFields(){ inty=chineseYear; intm=chineseMonth; intd=chineseDate; areChineseFieldsComputed=true; areFieldsSet=true; lastSetChinese=false; //调整日期范围 if(y<1900) y=1899; elseif(y>2100) y=2101; if(m<-12) m=-12; elseif(m>12) m=12; if(d<1) d=1; elseif(d>30) d=30; intdateint=y*10000+Math.abs(m)*100+d; if(dateint<19001111){//太小 set(1901,Calendar.JANUARY,1); super.complete(); }elseif(dateint>21001201){//太大 set(2100,Calendar.DECEMBER,31); super.complete(); }else{ if(Math.abs(m)>12){ m=12; } intdays=ChineseCalendar.daysInChineseMonth(y,m); if(days==0){ m=-m; days=ChineseCalendar.daysInChineseMonth(y,m); } if(d>days){ d=days; } set(y,Math.abs(m)-1,d); computeChineseFields(); intamount=0; while(chineseYear!=y||chineseMonth!=m){ amount+=daysInChineseMonth(chineseYear,chineseMonth); chineseMonth=nextChineseMonth(chineseYear,chineseMonth); if(chineseMonth==1){ chineseYear++; } } amount+=d-chineseDate; super.add(Calendar.DATE,amount); } computeChineseFields(); } /** *使用公历日期计算出农历日期 */ privatevoidcomputeChineseFields(){ intgregorianYear=internalGet(Calendar.YEAR); intgregorianMonth=internalGet(Calendar.MONTH)+1; intgregorianDate=internalGet(Calendar.DATE); if(gregorianYear<1901||gregorianYear>2100){ return; } intstartYear,startMonth,startDate; if(gregorianYear<2000){ startYear=baseYear; startMonth=baseMonth; startDate=baseDate; chineseYear=baseChineseYear; chineseMonth=baseChineseMonth; chineseDate=baseChineseDate; }else{ //第二个对应日,用以提高计算效率 //公历2000年1月1日,对应农历4697(1999)年11月25日 startYear=baseYear+99; startMonth=1; startDate=1; chineseYear=baseChineseYear+99; chineseMonth=11; chineseDate=25; } intdaysDiff=0; //年 for(inti=startYear;i<gregorianYear;i++){ if(isGregorianLeapYear(i)){ daysDiff+=366;//leapyear }else{ daysDiff+=365; } } //月 for(inti=startMonth;i<gregorianMonth;i++){ daysDiff+=daysInGregorianMonth(gregorianYear,i-1); } //日 daysDiff+=gregorianDate-startDate; chineseDate+=daysDiff; intlastDate=daysInChineseMonth(chineseYear,chineseMonth); while(chineseDate>lastDate){ chineseDate-=lastDate; chineseMonth=nextChineseMonth(chineseYear,chineseMonth); if(chineseMonth==1){ chineseYear++; } lastDate=daysInChineseMonth(chineseYear,chineseMonth); } } /** *计算节气 */ privatevoidcomputeSolarTerms(){ intgregorianYear=internalGet(Calendar.YEAR); intgregorianMonth=internalGet(Calendar.MONTH); if(gregorianYear<1901||gregorianYear>2100){ return; } sectionalTerm=sectionalTerm(gregorianYear,gregorianMonth); principleTerm=principleTerm(gregorianYear,gregorianMonth); } /*接下来是静态方法~*/ /** *是否为公历闰年 * *@paramyear *@return */ publicstaticbooleanisGregorianLeapYear(intyear){ booleanisLeap=false; if(year%4==0){ isLeap=true; } if(year%100==0){ isLeap=false; } if(year%400==0){ isLeap=true; } returnisLeap; } /** *计算公历年的当月天数,公历月从0起始! * *@paramy *@paramm *@return */ publicstaticintdaysInGregorianMonth(inty,intm){ intd=daysInGregorianMonth[m]; if(m==Calendar.FEBRUARY&&isGregorianLeapYear(y)){ d++;//公历闰年二月多一天 } returnd; } /** *计算公历年当月的节气,公历月从0起始! * *@paramy *@paramm *@return */ publicstaticintsectionalTerm(inty,intm){ m++; if(y<1901||y>2100){ return0; } intindex=0; intry=y-baseYear+1; while(ry>=sectionalTermYear[m-1][index]){ index++; } intterm=sectionalTermMap[m-1][4*index+ry%4]; if((ry==121)&&(m==4)){ term=5; } if((ry==132)&&(m==4)){ term=5; } if((ry==194)&&(m==6)){ term=6; } returnterm; } /** *计算公历年当月的中气,公历月从0起始! * *@paramy *@paramm *@return */ publicstaticintprincipleTerm(inty,intm){ m++; if(y<1901||y>2100){ return0; } intindex=0; intry=y-baseYear+1; while(ry>=principleTermYear[m-1][index]){ index++; } intterm=principleTermMap[m-1][4*index+ry%4]; if((ry==171)&&(m==3)){ term=21; } if((ry==181)&&(m==5)){ term=21; } returnterm; } /** *计算农历年的天数 * *@paramy *@paramm *@return */ publicstaticintdaysInChineseMonth(inty,intm){ //注意:闰月m<0 intindex=y-baseChineseYear+baseIndex; intv=0; intl=0; intd=30; if(1<=m&&m<=8){ v=chineseMonths[2*index]; l=m-1; if(((v>>l)&0x01)==1){ d=29; } }elseif(9<=m&&m<=12){ v=chineseMonths[2*index+1]; l=m-9; if(((v>>l)&0x01)==1){ d=29; } }else{ v=chineseMonths[2*index+1]; v=(v>>4)&0x0F; if(v!=Math.abs(m)){ d=0; }else{ d=29; for(inti=0;i<bigLeapMonthYears.length;i++){ if(bigLeapMonthYears[i]==index){ d=30; break; } } } } returnd; } /** *计算农历的下个月 * *@paramy *@paramm *@return */ publicstaticintnextChineseMonth(inty,intm){ intn=Math.abs(m)+1; if(m>0){ intindex=y-baseChineseYear+baseIndex; intv=chineseMonths[2*index+1]; v=(v>>4)&0x0F; if(v==m){ n=-m; } } if(n==13){ n=1; } returnn; } /*日历第一天的日期*/ privatestaticfinalintbaseYear=1901; privatestaticfinalintbaseMonth=1; privatestaticfinalintbaseDate=1; privatestaticfinalintbaseIndex=0; privatestaticfinalintbaseChineseYear=1900; privatestaticfinalintbaseChineseMonth=11; privatestaticfinalintbaseChineseDate=11; /*中文字符串*/ privatestaticfinalString[]chineseWeekNames={"","星期日","星期一","星期二", "星期三","星期四","星期五","星期六"}; privatestaticfinalString[]chineseMonthNames={"","正","二","三","四", "五","六","七","八","九","十","十一","十二"}; privatestaticfinalString[]chineseDateNames={"","初一","初二","初三", "初四","初五","初六","初七","初八","初九","初十","十一","十二","十三","十四", "十五","十六","十七","十八","十九","二十","廿一","廿二","廿三","廿四","廿五", "廿六","廿七","廿八","廿九","三十"}; privatestaticfinalString[]principleTermNames={"大寒","雨水","春分", "谷雨","夏满","夏至","大暑","处暑","秋分","霜降","小雪","冬至"}; privatestaticfinalString[]sectionalTermNames={"小寒","立春","惊蛰", "清明","立夏","芒种","小暑","立秋","白露","寒露","立冬","大雪"}; privatestaticfinalString[]stemNames={"","甲","乙","丙","丁","戊", "己","庚","辛","壬","癸"}; privatestaticfinalString[]branchNames={"","子","丑","寅","卯","辰", "巳","午","未","申","酉","戌","亥"}; privatestaticfinalString[]animalNames={"","鼠","牛","虎","兔","龙", "蛇","马","羊","猴","鸡","狗","猪"}; /*接下来是数据压缩表~*/ privatestaticfinalint[]bigLeapMonthYears={6,14,19,25,33,36,38, 41,44,52,55,79,117,136,147,150,155,158,185,193}; privatestaticfinalchar[][]sectionalTermMap={ {7,6,6,6,6,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,5,5, 5,5,5,4,5,5}, {5,4,5,5,5,4,4,5,5,4,4,4,4,4,4,4,4,3,4,4,4,3, 3,4,4,3,3,3}, {6,6,6,7,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,6,5,5, 5,5,4,5,5,5,5}, {5,5,6,6,5,5,5,6,5,5,5,5,4,5,5,5,4,4,5,5,4,4, 4,5,4,4,4,4,5}, {6,6,6,7,6,6,6,6,5,6,6,6,5,5,6,6,5,5,5,6,5,5, 5,5,4,5,5,5,5}, {6,6,7,7,6,6,6,7,6,6,6,6,5,6,6,6,5,5,6,6,5,5, 5,6,5,5,5,5,4,5,5,5,5}, {7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6, 7,7,6,6,6,7,7}, {8,8,8,9,8,8,8,8,7,8,8,8,7,7,8,8,7,7,7,8,7,7, 7,7,6,7,7,7,6,6,7,7,7}, {8,8,8,9,8,8,8,8,7,8,8,8,7,7,8,8,7,7,7,8,7,7, 7,7,6,7,7,7,7}, {9,9,9,9,8,9,9,9,8,8,9,9,8,8,8,9,8,8,8,8,7,8, 8,8,7,7,8,8,8}, {8,8,8,8,7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7, 7,7,6,6,7,7,7}, {7,8,8,8,7,7,8,8,7,7,7,8,7,7,7,7,6,7,7,7,6,6, 7,7,6,6,6,7,7}}; privatestaticfinalchar[][]sectionalTermYear={ {13,49,85,117,149,185,201,250,250}, {13,45,81,117,149,185,201,250,250}, {13,48,84,112,148,184,200,201,250}, {13,45,76,108,140,172,200,201,250}, {13,44,72,104,132,168,200,201,250}, {5,33,68,96,124,152,188,200,201}, {29,57,85,120,148,176,200,201,250}, {13,48,76,104,132,168,196,200,201}, {25,60,88,120,148,184,200,201,250}, {16,44,76,108,144,172,200,201,250}, {28,60,92,124,160,192,200,201,250}, {17,53,85,124,156,188,200,201,250}}; privatestaticfinalchar[][]principleTermMap={ {21,21,21,21,21,20,21,21,21,20,20,21,21,20,20,20, 20,20,20,20,20,19,20,20,20,19,19,20}, {20,19,19,20,20,19,19,19,19,19,19,19,19,18,19,19, 19,18,18,19,19,18,18,18,18,18,18,18}, {21,21,21,22,21,21,21,21,20,21,21,21,20,20,21,21, 20,20,20,21,20,20,20,20,19,20,20,20,20}, {20,21,21,21,20,20,21,21,20,20,20,21,20,20,20,20, 19,20,20,20,19,19,20,20,19,19,19,20,20}, {21,22,22,22,21,21,22,22,21,21,21,22,21,21,21,21, 20,21,21,21,20,20,21,21,20,20,20,21,21}, {22,22,22,22,21,22,22,22,21,21,22,22,21,21,21,22, 21,21,21,21,20,21,21,21,20,20,21,21,21}, {23,23,24,24,23,23,23,24,23,23,23,23,22,23,23,23, 22,22,23,23,22,22,22,23,22,22,22,22,23}, {23,24,24,24,23,23,24,24,23,23,23,24,23,23,23,23, 22,23,23,23,22,22,23,23,22,22,22,23,23}, {23,24,24,24,23,23,24,24,23,23,23,24,23,23,23,23, 22,23,23,23,22,22,23,23,22,22,22,23,23}, {24,24,24,24,23,24,24,24,23,23,24,24,23,23,23,24, 23,23,23,23,22,23,23,23,22,22,23,23,23}, {23,23,23,23,22,23,23,23,22,22,23,23,22,22,22,23, 22,22,22,22,21,22,22,22,21,21,22,22,22}, {22,22,23,23,22,22,22,23,22,22,22,22,21,22,22,22, 21,21,22,22,21,21,21,22,21,21,21,21,22}}; privatestaticfinalchar[][]principleTermYear={ {13,45,81,113,149,185,201}, {21,57,93,125,161,193,201}, {21,56,88,120,152,188,200,201}, {21,49,81,116,144,176,200,201}, {17,49,77,112,140,168,200,201}, {28,60,88,116,148,180,200,201}, {25,53,84,112,144,172,200,201}, {29,57,89,120,148,180,200,201}, {17,45,73,108,140,168,200,201}, {28,60,92,124,160,192,200,201}, {16,44,80,112,148,180,200,201}, {17,53,88,120,156,188,200,201}}; privatestaticfinalchar[]daysInGregorianMonth={31,28,31,30,31, 30,31,31,30,31,30,31}; privatestaticfinalchar[]chineseMonths={0x00,0x04,0xad,0x08,0x5a, 0x01,0xd5,0x54,0xb4,0x09,0x64,0x05,0x59,0x45,0x95,0x0a, 0xa6,0x04,0x55,0x24,0xad,0x08,0x5a,0x62,0xda,0x04,0xb4, 0x05,0xb4,0x55,0x52,0x0d,0x94,0x0a,0x4a,0x2a,0x56,0x02, 0x6d,0x71,0x6d,0x01,0xda,0x02,0xd2,0x52,0xa9,0x05,0x49, 0x0d,0x2a,0x45,0x2b,0x09,0x56,0x01,0xb5,0x20,0x6d,0x01, 0x59,0x69,0xd4,0x0a,0xa8,0x05,0xa9,0x56,0xa5,0x04,0x2b, 0x09,0x9e,0x38,0xb6,0x08,0xec,0x74,0x6c,0x05,0xd4,0x0a, 0xe4,0x6a,0x52,0x05,0x95,0x0a,0x5a,0x42,0x5b,0x04,0xb6, 0x04,0xb4,0x22,0x6a,0x05,0x52,0x75,0xc9,0x0a,0x52,0x05, 0x35,0x55,0x4d,0x0a,0x5a,0x02,0x5d,0x31,0xb5,0x02,0x6a, 0x8a,0x68,0x05,0xa9,0x0a,0x8a,0x6a,0x2a,0x05,0x2d,0x09, 0xaa,0x48,0x5a,0x01,0xb5,0x09,0xb0,0x39,0x64,0x05,0x25, 0x75,0x95,0x0a,0x96,0x04,0x4d,0x54,0xad,0x04,0xda,0x04, 0xd4,0x44,0xb4,0x05,0x54,0x85,0x52,0x0d,0x92,0x0a,0x56, 0x6a,0x56,0x02,0x6d,0x02,0x6a,0x41,0xda,0x02,0xb2,0xa1, 0xa9,0x05,0x49,0x0d,0x0a,0x6d,0x2a,0x09,0x56,0x01,0xad, 0x50,0x6d,0x01,0xd9,0x02,0xd1,0x3a,0xa8,0x05,0x29,0x85, 0xa5,0x0c,0x2a,0x09,0x96,0x54,0xb6,0x08,0x6c,0x09,0x64, 0x45,0xd4,0x0a,0xa4,0x05,0x51,0x25,0x95,0x0a,0x2a,0x72, 0x5b,0x04,0xb6,0x04,0xac,0x52,0x6a,0x05,0xd2,0x0a,0xa2, 0x4a,0x4a,0x05,0x55,0x94,0x2d,0x0a,0x5a,0x02,0x75,0x61, 0xb5,0x02,0x6a,0x03,0x61,0x45,0xa9,0x0a,0x4a,0x05,0x25, 0x25,0x2d,0x09,0x9a,0x68,0xda,0x08,0xb4,0x09,0xa8,0x59, 0x54,0x03,0xa5,0x0a,0x91,0x3a,0x96,0x04,0xad,0xb0,0xad, 0x04,0xda,0x04,0xf4,0x62,0xb4,0x05,0x54,0x0b,0x44,0x5d, 0x52,0x0a,0x95,0x04,0x55,0x22,0x6d,0x02,0x5a,0x71,0xda, 0x02,0xaa,0x05,0xb2,0x55,0x49,0x0b,0x4a,0x0a,0x2d,0x39, 0x36,0x01,0x6d,0x80,0x6d,0x01,0xd9,0x02,0xe9,0x6a,0xa8, 0x05,0x29,0x0b,0x9a,0x4c,0xaa,0x08,0xb6,0x08,0xb4,0x38, 0x6c,0x09,0x54,0x75,0xd4,0x0a,0xa4,0x05,0x45,0x55,0x95, 0x0a,0x9a,0x04,0x55,0x44,0xb5,0x04,0x6a,0x82,0x6a,0x05, 0xd2,0x0a,0x92,0x6a,0x4a,0x05,0x55,0x0a,0x2a,0x4a,0x5a, 0x02,0xb5,0x02,0xb2,0x31,0x69,0x03,0x31,0x73,0xa9,0x0a, 0x4a,0x05,0x2d,0x55,0x2d,0x09,0x5a,0x01,0xd5,0x48,0xb4, 0x09,0x68,0x89,0x54,0x0b,0xa4,0x0a,0xa5,0x6a,0x95,0x04, 0xad,0x08,0x6a,0x44,0xda,0x04,0x74,0x05,0xb0,0x25,0x54, 0x03}; privateStringgetChineseTerm(){ if(get(Calendar.DATE)==get(CHINESE_SECTIONAL_TERM)){ returnsectionalTermNames[get(Calendar.MONTH)]; }elseif(get(Calendar.DATE)==get(CHINESE_PRINCIPLE_TERM)){ returnprincipleTermNames[get(Calendar.MONTH)]; }else returnnull; } //addbyskywang privateStringgetLunarFestival(){ intday=get(CHINESE_DATE); intmonth=get(CHINESE_MONTH); StringsToday=day<10?"0"+day:""+day; StringsMonth=month<10?"0"+(month):""+(month); returnlFestival.get(sMonth+sToday); } privateStringgetSolarFestival(){ intday=get(Calendar.DATE); intmonth=get(Calendar.MONTH); StringsToday=day<10?"0"+day:""+day; StringsMonth=month<10?"0"+(month+1):""+(month+1); returnsFestival.get(sMonth+sToday); } privateStringgetFestivalOrTermOrDate(){ Stringret; if((ret=getSolarFestival())!=null) returnret; if((ret=getLunarFestival())!=null) returnret; returngetChinese(get(CHINESE_TERM_OR_DATE)); } //公历节日 privatestaticHashMap<String,String>sFestival=newHashMap<String,String>(); //农历介入 privatestaticHashMap<String,String>lFestival=newHashMap<String,String>(); static{ sFestival.put("0101","元旦"); sFestival.put("0214","情人节"); sFestival.put("0308","妇女节"); sFestival.put("0312","植树节"); sFestival.put("0401","愚人节"); sFestival.put("0501","劳动节"); sFestival.put("0504","青年节"); sFestival.put("0601","儿童节"); sFestival.put("0701","建党节"); sFestival.put("0801","建军节"); sFestival.put("0910","教师节"); sFestival.put("1001","国庆节"); sFestival.put("1031","万圣节"); //sFestival.put("1112","孙中山诞辰"); sFestival.put("1225","圣诞节"); lFestival.put("0101","春节"); //lFestival.put("0102","大年初二"); //lFestival.put("0103","大年初三"); lFestival.put("0115","元宵节"); lFestival.put("0505","端午节"); lFestival.put("0707","七夕"); lFestival.put("0815","中秋节"); lFestival.put("0909","重阳节"); lFestival.put("1208","腊八节"); //lFestival.put("1299","除夕"); } }