1. 程式人生 > >Java 語言程式設計(第十版) 第十三章 第4題

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

類圖:

這裡寫圖片描述