Loading

Java制作万年历

  1 import java.util.*;
  2 
  3  
  4 
  5 public class CalcDate {
  6      int year;
  7      int month;
  8      int day;
  9  
 10 public void Input(){//输入方法
 11 
 12     Scanner input = new Scanner(System.in);
 13     boolean flag = true;//控制检查日期格式输入是否正确的循环
 14     String date = "";//日期
 15 
 16     while(flag){
 17        System.out.print("请输入年,月,日(yyyy-mm-dd):");
 18        date = input.next();
 19        if(date.indexOf('-') != 4 && date.lastIndexOf('-') != 7){//判断日期格式
 20         System.out.println("日期格式输入错误!");
 21        }else{
 22         flag = false;
 23        }
 24     }
 25       String[] dateArr = date.split("-");//将日期字符串分割成年月日
 26       year = Integer.parseInt(dateArr[0]);
 27       month = Integer.parseInt(dateArr[1]);
 28       day = Integer.parseInt(dateArr[2]);
 29       
 30       int result = Calc(year,month,day);//计算
 31       switch(result){
 32       case 0:
 33        System.out.println("此日期是星期日");
 34        break;
 35       case 1:
 36        System.out.println("此日期是星期一");
 37            break;
 38       case 2:
 39        System.out.println("此日期是星期二");
 40        break;
 41       case 3:
 42        System.out.println("此日期是星期三");
 43        break;
 44       case 4:
 45        System.out.println("此日期是星期四");
 46        break;
 47       case 5:
 48        System.out.println("此日期是星期五");
 49        break;
 50       case 6:
 51        System.out.println("此日期是星期六");
 52        break;
 53       default://异常
 54        System.out.println("未知错误,程序中断!");
 55        break;
 56       }
 57 
 58 }
 59  
 60  public void ShowCalendar(){
 61   int days = 30;
 62   switch(month){//本月天数
 63   case 1:
 64    days = 31;
 65    break;
 66   case 2:
 67    if(IsLeapYear(year)){//闰年
 68     days = 29;
 69    }else{
 70     days = 28;
 71    }
 72    break;
 73   case 3:
 74    days = 31;
 75    break;
 76   case 4:
 77    days = 30;
 78    break;
 79   case 5:
 80    days = 31;
 81    break;
 82   case 6:
 83    days = 30;
 84    break;
 85   case 7:
 86    days = 31;
 87    break;
 88   case 8:
 89    days = 31;
 90    break;
 91   case 9:
 92    days = 30;
 93    break;
 94   case 10:
 95    days = 31;
 96    break;
 97   case 11:
 98    days = 30;
 99    break;
100   case 12:
101    days = 31;
102    break;
103   default://异常
104    System.out.println("未知错误");
105    break;
106   }
107   System.out.println("本月日历为\n日\t一\t二\t三\t四\t五\t六");//显示日历
108   int first = Calc(year,month,1);//获取本月一号是星期几
109   for(int i = 0;i < first;i++){//控制本月一号之前的空格数
110    System.out.print("  \t");
111   }
112   int j = 1;//本月一号
113   for(j = 1;j <= 7-first;j++){//第一行
114    System.out.print(j+"\t");
115   }
116   System.out.println();
117   while(j<days){//余下几行
118    int times = j+7;
119    for(;j<times;j++){
120     if(j>days){
121      break;
122     }
123     System.out.print(j+"\t");
124    }
125    System.out.println();
126   }
127  }
128  
129  public int Calc(int y,int m,int d){//计算方法
130   if(m == 1 || m == 2){//如果月份为一月或2月,则看成上一年的十三月和十四月
131    m += 12;
132    y--;
133   }
134   return (int)((d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)+1)%7;//代入基尔拉姆森公式
135  }
136  
137  public boolean IsLeapYear(int y){//判断是否为闰年
138   if((y % 400 == 0) ||(y % 100 != 0)&&(y % 4 ==0)){
139    return true;
140   }else{
141    return false;
142   }
143  }
144  
145  public static void main(String[] args) {
146   CalcDate t = newCalcDate();
147   Scanner input = new Scanner(System.in);
148   String con = "";
149   while(true){
150    t.Input();
151    t.ShowCalendar();
152    System.out.print("继续吗?(Y/N)");
153    con = input.next();
154    if(con.equalsIgnoreCase("Y")){
155     continue;
156    }
157    break;
158   }
159   System.out.println("程序结束,谢谢使用!");
160  }
161 }

 //欢迎转载,请注明原创,感谢

posted @ 2012-07-26 18:09  __Meow  阅读(472)  评论(6编辑  收藏  举报