Java打印日歷表


今天來吐槽一下Java的Calendar類的使用問題,反正我是弄了半天。

首先是,遇到一個問題,輸入年份和月份,需要打印這個月的日歷,網上有不少代碼,但我用了幾個感覺都不是很靠譜。

然后經過一番探索,最后敲定了下面這個程序:

import java.util.Arrays;
import java.util.Calendar;
import java.util.List;
import java.util.Scanner;

public class MyCal {

    public static void main(String[] args) {
        try (Scanner sc = new Scanner(System.in)) {
            System.out.println("please input the year:");
            int year = sc.nextInt();
            System.out.println("please input the month:");
            int month = sc.nextInt();
            List<String> MONTH_LIST = Arrays.asList(
                    "Jan", "Feb", "Mar", "Apr", "May", "Jun",
                    "Jul", "Aug", "Sept", "Oct", "Nov", "Dec"
            );
            System.out.printf("         %s, %4d\n", MONTH_LIST.get(month - 1), year);
            System.out.println("-----------------------------");
            System.out.println(" Sun Mon Tue Wed Thu Fri Sat");
            Calendar c = Calendar.getInstance();
            c.set(year, month-1, 1);
            int totalDay = c.getActualMaximum(Calendar.DATE);
            for (int i = 1; i < c.get(Calendar.DAY_OF_WEEK); i++)
                System.out.print("    ");
            for (int i = 1; i <= totalDay; i++) {
                c.set(year, month-1, i);
                System.out.printf("%4d", i);
                if (c.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY)
                    System.out.println("");
            }
        }
    }

}

set(year,month,date)的問題

c.set(year, month-1, 1);

網上的代碼真的不靠譜,沒幾個把API解釋清楚的。

我最后還是去翻官方API才發現,第二個參數月份是從0開始的,而第三個參數日期卻是從1開始的,着實坑了我一把。

getActualMaximum的用法

int totalDay = c.getActualMaximum(Calendar.DATE);

getActualMaximum方法可以直接獲取Calendar中一個字段的最大值,getActualMaximum(Calendar.DATE)的意思就是獲取這個月日期的最大值。

還可以這樣用:
getActualMaximum(Calendar.MONTH)獲取月份的最大值
getActualMaximum(Calendar.HOUR)獲取小時數的最大值

是否加get

再說一下c.get(Calendar.DAY_OF_WEEK)Calendar.DAY_OF_WEEK的區別,加不加get有很大的區別,我一開始也沒注意,Calendar內部實現和get的返回值是有偏差的,好像是1。

如果不注意,可能就像我一樣,調日期的格式調了半天。

Calendar.DAY_OF_WEEK

Calendar.DAY_OF_WEEK這個函數網上的博客很多也沒講清楚,其實它的功能是獲得當前日期是禮拜幾。
但是就像上面說的一樣,如果外面不套一個get,實際上你獲得的和Calendar.SATURDAY是有偏差的,例如Calendar.DAY_OF_WEEK==Calendar.SATURDAYc.get(Calendar.DAY_OF_WEEK)==Calendar.SATURDAY是不一樣的。

程序邏輯

先在循環體外面打印空格,分析一下,應該是填入get(Calendar.DAY_OF_WEEK)Tab(四個空格)。

循環體里面的邏輯也很簡單,每次都重新設置一下日期,從這個月的1號開始設置到最后一天,如果這天正好是星期六,那么下一次就需要換行輸出。

測試

最后的結果大概是這樣的:

please input the year:
2019
please input the month:
11
         Nov, 2019
-----------------------------
 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM