本帖最后由 xfbyxq 于 2016-7-4 02:10 编辑
搞到凌晨2点我才弄好,完全自己写的。申请版主加精
import java.util.*;
class Calender2 {
public static void main(String[] args) {
/*
从1900到指定年指定月得出相应的日历
思路
1900年1月第一个星期是从1开始的
到指定年指定月之间只要得出总共多少天%7 就能到到指定月份的开始星期数
*/
Scanner sc=new Scanner(System.in);
System.out.println("请输入1900以上的年份");
System.out.println("-----------------------------------------------------------");
System.out.println("请输入一个年份");
int year=sc.nextInt();
System.out.println("请输入一个月份");
int month=sc.nextInt();
System.out.println("------------------------------------------------------------");
printCalendar(year,month);
System.out.println();
}
//打印日历
public static void printCalendar(int year,int month){
System.out.println("星期一\t星期二\t星期三\t星期四\t星期五\t星期六\t星期日");
//定义变量来保存从1900年到指定年的总天数
int sum=0;
sum+=getDay(year);//获取总天数
//遍历指定年剩下的月份的总天数
for (int x=1;x<month ;x++ ) {
sum+=getMouthDay(x,year);//获取每个月的天数累加
}
//获取指定月份总共有多少天
int mouthDay=getMouthDay(month,year);
//根据指定月份的天数来循环
int x=1;
while(x<=mouthDay){
//因为日历每行要输出7天,所以建立一个循环遍历7次来打印
for (int h=0;h<7 ;h++ ) {
//因为有些月起始星期是不固定的,所以要先判断先输出多少次空字符
//利用总天数%7可以得到本月起始星期
if(x==1 && h<sum%7){
System.out.print(" \t");
continue;
}
//打印第几天
System.out.print(" "+x+" \t");
//这里要做个判断当x值已经到达当前月最后一天时,要跳出循环
if(x>=mouthDay) return;
//每当打印了一次天数就把x累加1
x++;
}
System.out.println();
}
}
//获取指定年月的天数
public static int getMouthDay(int mouth,int year){
int sum=0;
//根据月份返回总共有多少天
switch(mouth){
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
sum=31;
break;
case 4:
case 6:
case 9:
case 11:
sum=30;
break;
case 2:
if(isLeapYear(year)){
sum=29;
}else{
sum=28;
}
break;
}
return sum;
}
//获取从1900年到指定年所有天数
public static int getDay(int year){
//定义变量来保存总天数
int sum=0;
//循环遍历从1900年到指定年
for (int x=1900;x<year ;x++ ) {
/*
如果当前年是瑞年就+=366天否则+=365天
*/
if(isLeapYear(x)){
sum+=366;
}else{
sum+=365;
}
}
return sum;
}
//判断是否是瑞年
public static boolean isLeapYear(int year){
if((year%4==0&&year%100!=0)||year%400==0){
return true;
}else{
return false;
}
}
}
|