Java 语言程序设计(第十版) 第十三章 第4题

13.4

显示日历

import java.text.SimpleDateFormat;
import java.util.Date;

class PrintCalendar {
    private String year;
    private String month;
    public PrintCalendar() {
        this.year = getCurrentYear();
        this.month = getCurrentMonth();
    }
    public PrintCalendar(String month) {
        this.year = getCurrentYear();
        this.month = month;
    }
    public PrintCalendar(String year, String month) {
        this.year = year;
        this.month = month;
    }
    public static String getCurrentYear() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
        Date date = new Date();
        return sdf.format(date);
    }
    public static String getCurrentMonth() {
        SimpleDateFormat sdf = new SimpleDateFormat("MM");
        Date date = new Date();
        return sdf.format(date);
    }
    public String getYear() {
        return year;
    }
    public void setYear(String year) {
        this.year = year;
    }
    public String getMonth() {
        return month;
    }
    public void setMonth(String month) {
        this.month = month;
    }
    public void printMonth() {
        printMonthTitle(getYear(), getMonth());
        printMonthBody(getYear(), getMonth());
    }
    private void printMonthBody(String year, String month) {
        int startDay = getStartDay(year, month);  //得到每月开始天数
        int numberofDaysInMonth = getNumberOfDaysInMonth(year, month); //得到每月具体时间
        int i = 0;
        for (i = 0; i < startDay; i++) { 
            System.out.print("    "); 
        }
        for (i = 1; i <= numberofDaysInMonth; i++) {
            System.out.printf("%4d", i);
            if ((i + startDay) % 7 == 0) {
                System.out.println();
            }
        }
        System.out.println();
    }
    private int getNumberOfDaysInMonth(String year, String month1) {
        int month = Integer.parseInt(month1);
        if (month == 1 || month == 3 || month == 5 || month == 7 ||
                month == 8 || month == 10 || month ==12) {
                return 31;
            } else if (month == 2) 
                return isLeapYear(year)?29:28;
            else if (month == 4 || month ==6 || month == 9 || month == 11)
                return 30;
            return 0; //当month值错误的时候,返回0
    }
    private boolean isLeapYear(String year2) {
        int year = Integer.parseInt(year2);
        return year % 400 == 0 || (year % 4 == 0 && year % 100 != 0);
    }
    private int getStartDay(String year2, String month2) {
        final int START_DAY_FOR_JAN_1_1800 = 3;
        int totalNumberDays = getTotalNumberOfDays(year, month);

        return (totalNumberDays + START_DAY_FOR_JAN_1_1800) % 7;
    }
    private int getTotalNumberOfDays(String year2, String month2) {
        int year = Integer.parseInt(year2);
        int month = Integer.parseInt(month2);
        int total = 0; 
        for (int i = 1800; i < year; i++) {
            if ( isLeapYear(i+"") ) 
                total += 366;
            else 
                total += 365;
        }
        for (int i = 1; i < month; i++) {
            total += getNumberOfDaysInMonth(year2, i+"");
        }
        return total;
    }
    private void printMonthTitle(String year2, String month2) {
        System.out.println("         " + getMonthName(month) + "  " + year);
        System.out.println("-------------------------------");
        System.out.println(" Sun Mon Tue Wed Thu Fri Sat");
    }
    private String getMonthName(String month2) {
        String monthName = "";
        int month = Integer.parseInt(month2);
        switch (month) {
            case 1: monthName = "Janurary"; break;
            case 2: monthName = "February"; 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 = "September";break;
            case 10:monthName = "October";  break;
            case 11:monthName = "November"; break;
            case 12:monthName = "December"; break;
            default: try {
                    throw new Exception("The month number input error.");
                } catch (Exception e) {
                    e.printStackTrace();
                }
        }
        return monthName;
    }
}

测试:

public class Test13_4 {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        PrintCalendar t = new PrintCalendar();
        t.printMonth();
        PrintCalendar t2 = new PrintCalendar("7");
        t2.printMonth();
        PrintCalendar t3 = new PrintCalendar("2079","8");
        t3.printMonth();
    }   
}

结果

         June  2018
-------------------------------
 Sun Mon Tue Wed Thu Fri Sat
                       1   2
   3   4   5   6   7   8   9
  10  11  12  13  14  15  16
  17  18  19  20  21  22  23
  24  25  26  27  28  29  30

         July  2018
-------------------------------
 Sun Mon Tue Wed Thu Fri Sat
   1   2   3   4   5   6   7
   8   9  10  11  12  13  14
  15  16  17  18  19  20  21
  22  23  24  25  26  27  28
  29  30  31
         August  2079
-------------------------------
 Sun Mon Tue Wed Thu Fri Sat
           1   2   3   4   5
   6   7   8   9  10  11  12
  13  14  15  16  17  18  19
  20  21  22  23  24  25  26
  27  28  29  30  31

类图:

这里写图片描述

猜你喜欢

转载自blog.csdn.net/qq_37131037/article/details/80719882