Java万年历

来源:互联网 发布:手机装windows 编辑:程序博客网 时间:2024/05/21 03:20


import java.util.Scanner;


/*


  参考1900-1-1,这一天是星期一,

求得总天数,并对7求余,等到的数就是日历表中距离左边的空格数

(上一个月的日期)

当然对于win7来说就是这样的规律。

 */
public class Test {


public static void main(String[] args) {
//1)从键盘上输入一个年,月
Scanner sc = new  Scanner(System.in);
System.out.println("请输入年和月");
int year = sc.nextInt();
int month = sc.nextInt();

//2)打印
printCalendar(year,month);
}



public static void printCalendar(int year, int month) {

//打印表头
System.out.println("日\t一\t二\t三\t四\t五\t六\t");


int fromday = getWeekday(year,month,1);
int count =  0;//统计打印的数字的个数

//先打印当前月第一周之前的空白
for(int i = 1; i <= fromday; i++){
System.out.print("\t");
count++;
}

//打印当月的天数

int days = getMohthDays(year,month);
for(int i = 1; i<=days ; i++){
System.out.print(i + "\t");
count++;
//判断是否需要换行 
if (count % 7 == 0) {
System.out.println();
}
}

}


//返回指定年,月的天数
private static int getMohthDays(int year, int month) {
switch (month) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
return 31;
case 4:
case 6:
case 9:
case 11:
return 30;
case 2:
//如果是闰年返回29天,否则返回28天
if ( isLeap(year)) {
return 29;
}else {
return 28;
}
}
return 0;
}


//判断是否为闰年
private static boolean isLeap(int year) {
if ( year%4==0 && year%100!=0  || year%400==0) {
return true;
}
return false;
}

//返回指定日期是星期几的数字, 0~6, 返回0表示星期日,返回1表示星期一
private static int getWeekday(int year, int month, int day) {
//先计算 1900-1-1 到指定日期间隔的总天数
int sumDays = getSumDays(year, month, day);
return sumDays%7;
}


//返回1900-1-1 到指定日期间隔的总天数
private static int getSumDays(int year, int month, int day) {
// 2017- 8 -26
int sum = 0 ;
//先计算整年的天数,即 1900到year-1年的总天数, 1900到2016年年底的总天数
for(int y = 1900; y < year; y++){
sum += getDaysOfYear(y); 
}

//再计算 当年整月的总天数,即year这一年从1月到month-1月的天数, 2017年1月到7月的总天数
for( int m = 1 ; m < month; m++ ){
sum += getMohthDays(year, m);
}

//最后加上当月的天数, 2017年8月当月的天数
sum += day;
return  sum;
}


//返回指定年的天数
private static int getDaysOfYear(int year) {
if (isLeap(year)) {
return 366;
}
return 365;
}
原创粉丝点击