/*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();
}
}
}