記錄一下Java實現的一個日曆小程序,效果圖以下:java
實現以上的效果,咱們須要用到兩個類:SimpleDateFormat和Calendar。小程序
首先看看這兩個類的用法:ide
SimpleDateFormat
是一個以與語言環境有關的方式來格式化和解析日期的具體類。它容許進行格式化(日期(Date) -> 文本(String))、解析(文本(String) -> 日期(Date))和規範化。spa
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
類是一個抽象類,它爲特定瞬間與一組諸如 YEAR(年)
、MONTH(月)
、Date(日)
等日曆字段之間的轉換提供了一些方法,併爲操做日曆字段(例如得到下星期的日期)提供了一些方法。code
日曆類使咱們更好的對時間進行操做,使咱們能夠輕易獲取到具體的某個時間字段,並能對時間字段進行增、減、設置等操做。orm
日曆類是一個抽象類,因此咱們不能對其進行實例化,但該類提供了一個靜態方法getInstance,因此咱們能夠經過該方法來獲取一個Calendar的對象實例。
對象
咱們的目的是作一個日曆,而日曆最重要的是獲取當月第一天是星期幾以及獲取該月的最大天數,Calendar都爲咱們提供了具體的方法來實現。blog
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 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(); } }
這樣,咱們的日曆就完成啦。不過這裏還有別的一些問題,好比咱們在捕獲格式轉換異常時,若是程序繼續往下執行,則可能會發生空指針異常,不過再添加一個異常捕獲就行了。