Java 实现万年历总结
一,java实现万年历的代码:
package calendar; import java.util.scanner;//日历项目 public class rili{ public static void main(string[] args){ scanner a=new scanner(system.in); system.out.println("请输入年份:"); int year=a.nextint(); system.out.println("请输入月份:"); int month=a.nextint(); int sum=0; for(int i=1900;i<year;i++){ if(i%4==0&&i%100!=0||i%400==0){ sum=sum+366; }else{ sum=sum+365; } } for(int i=1;i<month;i++){ if(i==2){ if(year%4==0&&year%100!=0||year%400==0){ sum=sum+29;} else{ sum=sum+28; } }else{ if(i==4||i==6||i==9||i==11){ sum+=30; }else{ sum+=31; } } } sum=sum+1; int wekday=sum%7; system.out.println("日\t一\t二\t三\t四\t五\t六"); for(int i=1;i<=wekday;i++){ system.out.print("\t"); } int f=0; if(month==4||month==6||month==9||month==11){ f=30;} if(month==1||month==3||month==5||month==7||month==8||month==10||month==12){f=31;} if(month==2){ if(year%4==0&&year%100!=0||year%400==0){f=29;} else{f=28;} } for(int i=1;i<=f;i++){ if(sum%7==6){ system.out.print(i+"\n"); }else{ system.out.print(i+"\t"); } sum++; } } }
二.一个java万年历,比较简单的那种,显示年月日、星期几、当前日期是第几周、显示闰年、打印万年历等,还可显示当前日期是一年中的第几天,指定日期是星期几等,采用了基姆拉尔森计算公式 ,w= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 ,在公式中d表示日期中的日数,m表示月份数,y表示年数。注意:在公式中有个与其他公式不同的地方: 把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。
public class mycalendar { //以下程序段是用来计算输入日期为该年的第几天的 public static int cptday(int year , int month , int day){ byte dayadd[]={1,-2,1,0,1,0,1,1,0,1,0,1}; //用来存储每个月天数和30的差值 int daycount = 0; //这是天数daycount计数器,初始化为0 for(int i=0; i<month-1; i++) daycount+=(30+dayadd[i]); daycount+=day; return (month>2)?daycount+isleap(year):daycount; } //闰年判定程序段,闰年返回1,平年返回0 public static int isleap(int year){ if((year%400==0)||((year%4==0)&&(year%100!=0))) return 1; return 0; } //计算输入日期是星期几 //采用了基姆拉尔森计算公式 //w= (d+2*m+3*(m+1)/5+y+y/4-y/100+y/400) mod 7 //在公式中d表示日期中的日数,m表示月份数,y表示年数。 //注意:在公式中有个与其他公式不同的地方: //把一月和二月看成是上一年的十三月和十四月,例:如果是2004-1-10则换算成:2003-13-10来代入公式计算。 public static int getweek(int year,int month,int day){ if(month<3) { month+=12; year--;} return (day+2*month+3*(month+1)/5+year+year/4-year/100+year/400)%7; } //以下程序段是来计算输入日期为该年第几周的 public static int weekcount(int year,int month,int day){ int daycnt = cptday(year,month,day); int weekminus = getweek(year,month,day)-getweek(year,1,1); int weekcnt = 0; if(daycnt%7==0) weekcnt = daycnt/7+((weekminus>0)?1:0); else weekcnt = daycnt/7+((weekminus>0)?2:1); return weekcnt; } //打印万年历 public static void printcal(int year){ byte dayadd[]={0,1,-2,1,0,1,0,1,1,0,1,0,1}; //同样的,每月天数和30的差值,注意,dadadd[0]的0并没用到 int wkpoint = getweek(year,1,1); //wkpoint用来指出当前日期的星期数 int t = 0; //t用来作为一个标记器,解决闰年2月有29天的问题 int bk = 0; //bk用来记录需输空白的数目 string week[]={"星期一","星期二","星期三","星期四","星期五","星期六","星期日"}; for(int i=1;i<13;i++) { t = 0; bk = 0; if((i==2)&&(isleap(year)==1)) t = 1; //当且仅当闰年的2月份才将其置为1 system.out.println("\n\n\t\t"+year+" 年 "+i+" 月\n"); for(int j=0;j<7;j++) system.out.print(week[j]+"\t"); system.out.println(); while(bk++<wkpoint) system.out.print('\t'); for(int j=1;j<=(30+dayadd[i]+t);j++) { system.out.print(j+"\t"); //循环输出每月日期 if(wkpoint==6) { wkpoint = 0; system.out.print('\n');} //当wkpoint计数器为6时将其置为0,并换行 else wkpoint++; } } } public static void main(string[] args){ string week[]={"星期一","星期二","星期三","星期四","星期五","星期六","星期日"}; system.out.println("输入的日期是该年的第"+cptday(2009,2,15)+"天"); system.out.println("这一天是该年的第"+weekcount(2009,2,15)+"周 "+week[getweek(2009,2,15)]); printcal(2009); } }
三、
1.用户输入信息-->进行信息判断(是否符合要求)
2.以1900年1月1日(星期一)为基准,计算1900年1月1日至当日的总天数
(1)先计算1900年至(用户输入的年 - 1)的总天数 -->注意平闰年之分
(2)计算用户输入年份的1月至(用户输入月份 - 1)的天数
3.计算输入月份的第一天是星期几
4.格式化输出
以下我们按照步骤一步一步进行代码解析
一)、利用do-while循环接受用户输入信息,并利用if-else语句进行判断
int year; int month; boolean xn = false; do { system.out.println("请输入年份:"); year = input.nextint(); system.out.println("请输入月份:"); month = input.nextint(); //利用boolean类型的表达式进行输入信息的判断 xn = (month < 1) || (month > 12) ||(year < 1); if(xn) { system.out.println("输入信息错误,请重新输入!"); } }while(xn);
二)、判断平闰年,并计算1900年至(用户输入年 - 1)的总天数
int everyyearday = 0; //每年的天数 int totalyearsdays = 0; //计算年的天数 int inputyearday = 0 //记录用户输入年的天数 boolean yn = false; //标识平闰年 //利用for循环计算天数 for(int i = 1900;i < =year;i ++) { if(((i % 4 == 0)&&(i % 100 != 0))||(i % 400 == 0)) //闰年的判断条件 { yn = true; everyyearday = 366; } else { yn = false; everyyearday = 365; } //如果循环中的年份小于用户输入的年份,则累积天数 if(i < year) { totalyearsdays = totalyearsdays + everyyearday; } else { inputyearday = everyyearday; system.out.println(year + "年共有:" + inputyearday + "天"); } }
三)、判断月份的天数,并计算当年1月至(用户输入月份 -1)的天数
int everymonthday = 0; //记录每月的天数 int totalmonthsdays = 0; //总天数 int inputmonthday = 0; //记录用户输入的月份在用户输入年份的天数 //利用for循环计算天数 for(int i = 1;i <= month;i ++) { switch(i) { case 4: case 6: case 9: case 11: everymonthday = 30; break; case 2: if(xn) //xn是用来记录平闰年的boolean类型的变量 { everymonthday = 29; } else { everymonthday = 28; } break; default: everymonthday = 31; break; } if(i < month) { totalmonthsdays = totalmonthsdays + everymonthday; } else { inputmonthday = everymonthday; system.out.println(month + "月共有:" + inputmonthday + "天"); } }
四)、计算总天数,并计算出用户输入的月份的第一天星期几
int total = totalmonthsdays + totalyearsdays; //计算总天数
int temp = (total + 1) % 7; //判断输入月份的第一天星期几
五)、格式化输出
//因为我们的输入格式是 //星期日 星期一 星期二 星期三 星期四 星期五 星期六 //当星期日时的时候,我们直接输出就好了,但是当 //第一天是星期一的时候,我们就必须首先打印出空格 //然后再输出日期,才能让号码和星期想对应 //打印空格 for(int spaceno = 0;spaceno < temp;spaceno ++) { system.out.print("/t"); } //按照顺序打印号码 for(int i = 1;i <= inputmonthday;i ++) { if((total + i ) % 7) //判断是否该换行了 { system.out.println(i ); } else { system.out.print(i + "/t"); } }
四、 java(用calendar类)写一个万年历,输入年并且显示当年的日历
public class mycalendar { public static void main(string args[]) { scanner sc = new scanner(system.in); calendar c = calendar.getinstance(); system.out.println("请输入数字年:(比如 2014)"); int year = sc.nextint(); sc.close(); // int year = 2014; c.set(calendar.year,year); for (int i = 0; i < 12; i++) { c.set(calendar.month,i); // c.set(calendar.date,1); //设置成1月 printmonth(c); } } public static void printmonth(calendar c){ c.set(calendar.day_of_month,1); //设置成一日 system.out.printf("\n\n========= %s 月 =========\n",c.get(calendar.month)+1); string[] weeks = { "日", "一" , "二", "三", "四", "五", "六" }; for (int i = 0; i < weeks.length; i++) { system.out.printf("%s" + (i != 6 ?"\t":"\n"),weeks[i]); } int offday = c.get(calendar.day_of_week) - 1; for(int i = 0; i < offday; i++){ system.out.printf("\t"); } int month = c.get(calendar.month); while(c.get(calendar.month) == month ){ system.out.printf("%d" + ( (c.get(calendar.day_of_week)) != 7 ? "\t":"\n") ,c.get(calendar.day_of_month)); c.add(calendar.day_of_month, 1); } } }
五、程序:万年历+时钟小程序实现
java知识点有:java常用内库与工具(date类、calendar类等)、异常(try.....catch)、线程、awt图形用户界面等基础知识点。
import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.text.*; import java.util.*; //创建窗口和年历 class mainframe extends jframe{ jpanel panel=new jpanel(new borderlayout());//borderlayout为边界布局 jpanel panel1=new jpanel(); jpanel panel2=new jpanel(new gridlayout(7,7));//gridlayout为网格布局 jpanel panel3=new jpanel(); jlabel []label=new jlabel[49]; jlabel y_label=new jlabel("年份"); jlabel m_label=new jlabel("月份"); jcombobox com1=new jcombobox(); jcombobox com2=new jcombobox(); jbutton button=new jbutton("查看"); int re_year,re_month; int x_size,y_size; string year_num; calendar now=calendar.getinstance(); //实例化calendar mainframe(){ super("万年历-jackbase"); setsize(300,350); x_size=(int)(toolkit.getdefaulttoolkit().getscreensize().getwidth()); y_size=(int)(toolkit.getdefaulttoolkit().getscreensize().getheight()); setlocation((x_size-300)/2,(y_size-350)/2); setdefaultcloseoperation(jframe.exit_on_close); panel1.add(y_label); panel1.add(com1); panel1.add(m_label); panel1.add(com2); panel1.add(button); for(int i=0;i<49;i++){ label=new jlabel("",jlabel.center);//将显示的字符设置为居中 panel2.add(label); } panel3.add(new clock(this)); panel.add(panel1,borderlayout.north); panel.add(panel2,borderlayout.center); panel.add(panel3,borderlayout.south); panel.setbackground(color.white); panel1.setbackground(color.white); panel2.setbackground(color.white); panel3.setbackground(color.white); init(); button.addactionlistener(new actionlistener(){ public void actionperformed(actionevent e){ int c_year,c_month,c_week; c_year=integer.parseint(com1.getselecteditem().tostring()); //得到当前所选年份 c_month=integer.parseint(com2.getselecteditem().tostring())-1; //得到当前月份,并减1,计算机中的月为0-11 c_week=use(c_year,c_month); //调用函数use,得到星期几 resetday(c_week,c_year,c_month); //调用函数resetday }}); setcontentpane(panel); setvisible(true); setresizable(false); } public void init(){ int year,month_num,first_day_num; string log[]={"日","一","二","三","四","五","六"}; for(int i=0;i<7;i++){ label.settext(log); } for(int i=0;i<49;i=i+7){ label.setforeground(color.red); //将星期日的日期设置为红色 } for(int i=6;i<49;i=i+7){ label.setforeground(color.red);//将星期六的日期也设置为红色 } for(int i=1;i<10000;i++){ com1.additem(""+i); } for(int i=1;i<13;i++){ com2.additem(""+i); } month_num=(int)(now.get(calendar.month)); //得到当前时间的月份 year=(int)(now.get(calendar.year)); //得到当前时间的年份 com1.setselectedindex(year-1); //设置下拉列表显示为当前年 com2.setselectedindex(month_num); //设置下拉列表显示为当前月 first_day_num=use(year,month_num); resetday(first_day_num,year,month_num); } public int use(int reyear,int remonth){ int week_num; now.set(reyear,remonth,1); //设置时间为所要查询的年月的第一天 week_num= (int)(now.get(calendar.day_of_week));//得到第一天的星期 return week_num; } public void resetday(int week_log,int year_log,int month_log){ int month_score_log; //判断是否是闰年的标记 int month_day_score; //存储月份的天数 int count; month_score_log=0; month_day_score=0; count=1; if(year_log%4==0&&year_log%100!=0||year_log%400==0){//判断是否为闰年 month_score_log=1; } month_log=month_log+1; //将传来的月份数加1 switch(month_log){ case 1: case 3: case 5: case 7: case 8: case 10: case 12: month_day_score=31; break; case 4: case 6: case 9: case 11: month_day_score=30; break; case 2: if(month_score_log==1){ month_day_score=29; } else{ month_day_score=28; } break; } for(int i=7;i<49;i++){ //初始化标签 label.settext(""); } week_log=week_log+6; //将星期数加6,使显示正确 month_day_score=month_day_score+week_log; for(int i=week_log;i<month_day_score;i++,count++){ label.settext(count+""); } } } //创建时钟 class clock extends canvas implements runnable{ mainframe mf; thread t; string time; clock(mainframe mf){ this.mf=mf; setsize(400,40); setbackground(color.white); t=new thread(this); //实例化线程 t.start(); //调用线程 } public void run(){ while(true){ try{ t.sleep(1000); //休眠1秒钟 }catch(interruptedexception e){ system.out.println("异常"); } this.repaint(100); } } public void paint(graphics g){ font f=new font("宋体",font.bold,16); simpledateformat sdf=new simpledateformat("yyyy'年'mm'月'dd'日'hh:mm:ss");//格式化时间显示类型 calendar now=calendar.getinstance(); time=sdf.format(now.gettime()); //得到当前日期和时间 g.setfont(f); g.setcolor(color.red); g.drawstring(time,100,25); } } public class wnl{ public static void main(string [] args){ jframe.setdefaultlookandfeeldecorated(true); mainframe start=new mainframe(); } }
以上就是java 实现万年历的资料,希望能帮助实现该功能的朋友,谢谢大家对本站的支持!