簡易日歷制作
記錄一下Java實現的一個日歷小程序,效果圖如下:
實現以上的效果,我們需要用到兩個類:SimpleDateFormat和Calendar。
首先看看這兩個類的用法:
類 SimpleDateFormat
SimpleDateFormat
是一個以與語言環境有關的方式來格式化和解析日期的具體類。它允許進行格式化(日期(Date) -> 文本(String))、解析(文本(String) -> 日期(Date))和規范化。
具體要用到的方法
SimpleDateFormat(String pattern) 用給定的模式和默認語言環境的日期格式符號構造
SimpleDateFormat
。Date parse(String source) 從給定字符串的開始解析文本以生成日期。
這里我們使用SimpleDateFormat生成一個格式為“yyyy-MM”的實例,並通過parse方法將我們輸入的字符串轉換成日期(Date)對象。具體實現如下:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); //生成格式化實例 System.out.print("請輸入要查詢的月份(yyyy-MM):"); String str = scanner.next(); //獲取輸入字符串 Date date = null; //要獲取的Date對象變量 try { date = sdf.parse(str); //將字符串轉成日期對象,這里會拋出格式轉換異常,需要用try..catch進行處理 } catch (Exception e) { System.out.println("時間格式不正確"); }
類 Calendar
Calendar
類是一個抽象類,它為特定瞬間與一組諸如 YEAR(年)
、MONTH(月)
、Date(日)
等日歷字段之間的轉換提供了一些方法,並為操作日歷字段(例如獲得下星期的日期)提供了一些方法。
日歷類使我們更好的對時間進行操作,使我們可以輕易獲取到具體的某個時間字段,並能對時間字段進行增、減、設置等操作。
日歷類是一個抽象類,所以我們不能對其進行實例化,但該類提供了一個靜態方法getInstance,所以我們可以通過該方法來獲取一個Calendar的對象實例。
我們的目的是做一個日歷,而日歷最重要的是獲取當月第一天是星期幾以及獲取該月的最大天數,Calendar都為我們提供了具體的方法來實現。
要用到的方法
Calendar getInstance() 使用默認時區和語言環境獲得一個日歷。
void setTime(Date date) 使用給定的
Date
設置此 Calendar 的時間。int get(int field) 返回給定日歷字段的值。
int getActualMaximum(int field) 根據當前Calendar設置的時間來獲取指定字段的最大值。
我們需要用getInstance方法來獲取Calendar實例,並通過上面SimpleDateFormat中字符串轉成的Date對象來給我們的Calendar設置時間,最后通過get方法來獲取當月第一天是星期幾,並通過getActualMaximum方法來獲得當月天數。
注意的幾點:
- Calendar獲取的MONTH是從0開始,最大為11
- Calendar獲取的DAY_OF_WEEK為從1開始,最大為7,且1代表的是星期天,2~7代表是星期一到星期六
具體實現如下:

Calendar calendar = Calendar.getInstance(); //獲取Calendar對象 calendar.setTime(date); //給Calendar對象設置時間 int year = calendar.get(calendar.YEAR); //獲取所設置的年份 int month = calendar.get(calendar.MONTH); //獲取所設置的月 System.out.println("===================="+year+"年"+(month+1)+"月======================");

c.set(c.DATE, 1); int []dayOfWeek = {7,1,2,3,4,5,6}; int weekDay = c.get(c.DAY_OF_WEEK); int firstWeekDay = dayOfWeek[weekDay-1];
接下來我們要開始打印日期了,由於我們的日期是從1開始顯示,一直到當月的最大一天,但我們顯示的位置要和星期相對應,所以在這里我把日期(day)開始設置為“-firstWeekDay+1”,來填充前面所需要的空白。
我們還會涉及一個換行的問題,正常邏輯是每7天換行一次,而我們的日期是從“-firstWeekDay+1”開始的,所以我們在計算換行時需要再將其加上。具體實現見代碼吧。

int day = -firstWeekDay+1; //第一天 for (;day<=c.getActualMaximum(c.DATE); day++) { if(day<=0) { System.out.print("\t"); //day從1開始顯示 } else { System.out.print(day+"\t"); } if((day+firstWeekDay-1)%7 == 0){ //每計7天換行一次 System.out.println(); } }
這樣,我們的日歷就完成啦。不過這里還有別的一些問題,比如我們在捕獲格式轉換異常時,如果程序繼續往下執行,則可能會發生空指針異常,不過再添加一個異常捕獲就好了。