打印日历并调用多种方法的Java实例子

import java .util.Scanner;
public class 打印日历 {

public static void main(String args[]) {

Scanner input=new Scanner(System.in);

System.out.println("Enter full year(eg. 2012): ");
int year=input.nextInt();

//提示用户输入月份
System.out.println("Enter month as a number between 1 and 12: ");
int month=input.nextInt();//以上均为正常输入,年份和月份

printMonth(year,month);//调用第一个方法,也是总的方法


}

public static void printMonth(int year, int month) {//总的方法,打印日历,被调用
    // 打印日历头
    printMonthTitle(year,month);
    //打印日历主体
    printMonthBody(year,month);//可以分为两部,第一部分为打印标题,第二部分,打印主体

}
public static void printMonthTitle(int year, int month) {//先打印标题,调用了一个方法,“得到月份的英文名”
    System.out.println("                      "+getMonthName(month)+"  "+year);
    System.out.println("  Sun  Mon  Tue  Wed  Thu  Fri  Sat ");     
}
public static void printMonthBody(int year, int month) {//打印主体,调用了两个方法
    //Get start day of the week for the first date in the month
    int startDay=getStartDay(year,month);//得到该年该月的第一天的星期几?
    int numberOfDaysInMonth=getNumberOfDaysInMonth(year,month);//得到该月的天数,然后在下面打印出来
    // pad space before the first day of the month
    int i=0;
    for(i=0;i<startDay;i++)//根据得到的星期几而控制第一排空格的数量
        System.out.print("        ");

    for(i=1;i<=numberOfDaysInMonth;i++) {//打印天数
        System.out.printf("%6d",i);

        if((i+startDay)%7==0) //如果说第i天和第一天的距离为7的倍数,则跳转到下一行,比如startDay是5-Fri,那么当i=2,跳转到第二行。
          System.out.println();         
    }
    System.out.println();//只是在所有的都打印完了之后再空一行
}
// get the English name for the month
public static String getMonthName(int month) {//不调用任何方法,只是把数字和英文月数连接起来。
    String monthName=" ";
    switch(month) {
    case 1: monthName="January";break;
    case 2:monthName="Feburary";break;
    case 3:monthName="March"; break;
    case 4:monthName="April";break;
    case 5:monthName="May";break;
    case 6:monthName="June";break;
    case 7:monthName="July";break;
    case 8:monthName="August";break;
    case 9:monthName="Spetember";break;
    case 10:monthName="October";break;
    case 11:monthName="November";break;
    case 12:monthName="December";break;

    }
    return monthName;
}
public static int getStartDay(int year,int month) {//调用一个方法-----得到输入的年月到1800年1.1的天数

    final int START_DAY_FOR_JAN_1_1800=3;//1800年的1月1号是星期3
            //Get total number of days from 1/1/1800 to month/1/year
    int totalNumberOfDays=getTotalNumberOfDays(year,month);
    //return the start day for month/1/year
    return (totalNumberOfDays+START_DAY_FOR_JAN_1_1800)%7;//通过把总天数和1800年1.1的日期数加起来再求7的余数就可以了。

}
public static int getTotalNumberOfDays(int year, int month) {//调用一个方法,getNumberOfDaysInMonth
    //Get the total number of days since January 1, 1800
    int total=0;

    //Get the total days from 1800 to 1/1/year
    for(int i=1800;i<year;i++)
        if(isLeapYear(i))
            total=total+366;
        else
            total=total+365;//加上之前所有年的天数

    //Add days from January to the month prior to the current month
    for(int i=1;i<month;i++) //
        total=total+getNumberOfDaysInMonth(year,i);//调用方法,得到本年度所有月份中的天数

        return total;

}
public static int getNumberOfDaysInMonth(int year, int month) {
    if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
        return 31;


    if(month==4||month==6||month==9||month==11)
        return 30;

    if(month==2) return isLeapYear(year)? 29:28;

    return 0;//if month is incorrect


}
public static boolean isLeapYear(int year) {//决定是不是闰年
    //determine if it is a leapYear
    return year%400==0||(year%4==0&&year%100!=0);
}
}

//注意一共调用了8个方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值