java实现的功能受限的万年历,实现了特例需求,主要逻辑是正确的可以稍作改动变成符合其它要求的功能

6 篇文章 0 订阅
5 篇文章 0 订阅

/*getinfo.java设置已知的日子的星期信息,通过计算得到要求的日子具设定日子的天数和应该会是的星期信息*/

package wnl;

public class getinfo {
private final byte xingqi=7;
private final short year=2013;
private final byte month=11,day=17;
boolean whobig=false;//
static byte tdxingqi;
public getinfo(){
 if(subdayis()%7==0)
  tdxingqi=7;
 else{
  if(whobig)
  tdxingqi=(byte)(subdayis()%this.xingqi);
  else
   tdxingqi=(byte)(7-subdayis()%this.xingqi);
 }
 System.out.println(subdayis()+"\t"+tdxingqi);///
}
public short subdayis(){
 short daynum=0;
 if(wnllj.getyea()>year){//输入的年历大于已知的年历
  whobig=true;
  for(short i=year+1;i<wnllj.getyea()-1;i++){
   if(isrunyea(i))
    daynum+=366;
   else
    daynum+=365;
  }
  daynum+=houday(wnllj.getyea(),wnllj.getmon(),wnllj.getday())+qianday(year,month,day);
 }
 else if(wnllj.getyea()<year){
  for(short i=(short)(wnllj.getyea()+1);i<=year-1;i++){
   if(isrunyea(i))
    daynum+=366;
   else
    daynum+=365;
  }
  daynum+=qianday(wnllj.getyea(),wnllj.getmon(),wnllj.getday())+houday(year,month,day);
 }
 else{
  if(wnllj.getmon()>month){
   whobig=true;
   daynum+=houday(wnllj.getyea(),wnllj.getmon(),wnllj.getday())-houday(year,month,day);
  }
  else if(wnllj.getmon()<month){
   daynum+=houday(year,month,day)-houday(wnllj.getyea(),wnllj.getmon(),wnllj.getday());
  }
  else{
   if(wnllj.getday()>day){
   whobig=true;
   daynum+=wnllj.getday()-day; 
   }
   else if(wnllj.getday()<day){
    daynum+=day-wnllj.getday(); 
   }
  }
 }
 return daynum;
}
public short houday(short year,byte month,byte day){
 switch(month){
 case 1:
  return day;
 case 2:
  return (short)(31+day);
 case 3:
  if(isrunyea(year))
   return (short)(60+day);
  else
   return (short)(59+day);
 case 4:
  if(isrunyea(year))
   return (short)(91+day);
  else
   return (short)(90+day);
 case 5:
  if(isrunyea(year))
   return (short)(121+day);
  else
   return (short)(120+day);
 case 6:
  if(isrunyea(year))
   return (short)(152+day);
  else
   return (short)(151+day);
 case 7:
  if(isrunyea(year))
   return (short)(182+day);
  else
   return (short)(181+day);
 case 8:
  if(isrunyea(year))
   return (short)(213+day);
  else
   return (short)(212+day);
 case 9:
  if(isrunyea(year))
   return (short)(244+day);
  else
   return (short)(243+day);
 case 10:
  if(isrunyea(year))
   return (short)(274+day);
  else
   return (short)(273+day);
 case 11:
  if(isrunyea(year))
   return (short)(305+day);
  else
   return (short)(304+day);
 case 12:
  if(isrunyea(year))
   return (short)(335+day);
  else
   return (short)(334+day);
  default:
   return day;
 }
}
public short qianday(short year,byte month,byte day){
 switch(month){
 case 1:
  if(isrunyea(year))
   return (short)(366-day);
  else
   return (short)(365-day);
 case 2:
  if(isrunyea(year))
   return (short)(335-day);
  else
   return (short)(334-day);
 case 3:
   return (short)(306-day);
 case 4:
   return (short)(275-day);
 case 5:
   return (short)(245-day);
 case 6:
   return (short)(214-day);
 case 7:
   return (short)(184-day);
 case 8:
   return (short)(153-day);
 case 9:
   return (short)(122-day);
 case 10:
   return (short)(92-day);
 case 11:
   return (short)(61-day);
 case 12:
   return (short)(31-day);
  default:
   return day;
 }
}
public static boolean isrunyea(short year){
 if(year%100==0&&year%400==0)
  return true;
 else if(year%4==0)
  return true;
 return false;
}
}

/*show.java实现显示要求的日子所在的月份星期信息,以现实的日历显示*/

package wnl;

public class show {
 byte todayxq=getinfo.tdxingqi,today=wnllj.getday(),month=wnllj.getmon();
 short year=wnllj.getyea();
 public show(){
  showend();
 }
public void showkong(byte num,byte daynum){
 for(int h=0;h<num;h++)
  System.out.print(" \t");
 for(int m=0;m<daynum;m++){
  System.out.print(m+1+"\t");
  if((num+m+1)%7==0)
   System.out.print("\n");
 }
 System.out.println();
}
public void showxqm(){
 System.out.println("七\t一\t二\t三\t四\t五\t六");
}
public void showend(){
 byte num=(byte)((8+todayxq-today%7)%7);//-1
 showxqm();
 switch(month){
 case 1:
 showkong(num,(byte)31);
 break;
 case 2:
  if(getinfo.isrunyea(year))
  showkong(num,(byte)29);
  else
   showkong(num,(byte)28);
  break;
 case 3:
  showkong(num,(byte)31);
  break;
 case 4:
  showkong(num,(byte)30);
  break;
 case 5:
  showkong(num,(byte)31);
  break;
 case 6:
   showkong(num,(byte)30);
   break;
 case 7:
   showkong(num,(byte)31);
   break;
 case 8:
   showkong(num,(byte)31);
   break;
 case 9:
   showkong(num,(byte)30);
   break;
 case 10:
    showkong(num,(byte)31);
    break;
 case 11:
    showkong(num,(byte)30);
    break;
   default:
    showkong(num,(byte)31);
    break;
 }
}

}
/*wnllj.java实现要求日子的合法输入整合前面两个逻辑功能*/

package wnl;
import java.util.Scanner;
public class wnllj {
 Scanner scan;
 private String wnl;
 public static boolean down=false;
 private static short year;
 private static byte month,day;
public wnllj(){
 scan=new Scanner(System.in);
  input();
  if(getstr().charAt(0)=='0')
   down=true;
  else{
  if(figrueout(getstr())){
   fenge(getstr());
   if(ishefa()){
    new getinfo();//??
    new show();//??
   }
   else
    System.out.println("格式正确但是不合法!");
  }
  else{
   System.out.println("您的输入有问题,请参照这个格式(1991-11-24)!");
  }
  System.out.println("请您继续输入,想退出就请输入0!");
  }
}
public void input(){
 String ymd=scan.nextLine();
 setstr(ymd);
}
public void fenge(String str){
 short year;
 byte month,day;
 year=Short.parseShort(str.substring(0,4));
 month=Byte.parseByte(str.substring(5,7));
 day=Byte.parseByte(str.substring(8,10));
 setyea(year);
 setmon(month);
 setday(day);
}
public boolean ishefa(){
 if(getmon()>12||getmon()<0)
  return false;
 else if(getday()>31||getday()<0)
  return false;
 return true;
}
public static short getyea(){
 //System.out.println("@"+year);
 return year;
}
public void setyea(short str){
 year=str;
}
public static byte getmon(){
 //System.out.println("#"+month);
 return month;
}
public void setmon(byte str){
 month=str;
}
public static byte getday(){
 //System.out.println("%"+day);
 return day;
}
public void setday(byte str){
 day=str;
}
public String getstr(){
 return wnl;
}
public void setstr(String str){
 wnl=str;
}
public boolean figrueout(String str){
 if(str.length()!=10){
  //System.out.println("1");///
  return false;
 }
 else if(str.charAt(4)!='-'||str.charAt(7)!='-'){
  //System.out.println("2");///
  return false;
 }
 else if(!numgs(str)){
  //System.out.println("3");///
  return false;
 }
 return true;
}
public boolean isnum(char cha){
 if(cha<='9'&&cha>='0')
  return true;
 return false;
}
public boolean numgs(String str){
 if(isnum(str.charAt(0))&&isnum(str.charAt(1))&&isnum(str.charAt(2))&&isnum(str.charAt(3))&&isnum(str.charAt(5))&&isnum(str.charAt(6))&&isnum(str.charAt(8))&&isnum(str.charAt(9)))
  return true;
 return false;
}
}

/*Main.java实现循环求指定日子所在月份的日历信息显示功能,程序入口*/

package wnl;

public class Main {

 /**
  * @param args
  */
 public static void main(String[] args) {
  // TODO Auto-generated method stub
  while(true){
   if(wnllj.down)
    break;
   new wnllj();
  }
 }

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值