当前位置: 移动技术网 > IT编程>开发语言>Java > Java 实现万年历总结

Java 实现万年历总结

2019年07月22日  | 移动技术网IT编程  | 我要评论
一,java实现万年历的代码: package calendar; import java.util.scanner;//日历项目 public c

一,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 实现万年历的资料,希望能帮助实现该功能的朋友,谢谢大家对本站的支持!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网