更新時間:2022-09-15 來源:黑馬程序員 瀏覽量:
朋友們大家好,今天我給大家?guī)硪粋€控制臺小程序——打印當(dāng)月的日歷,效果如下圖:
筆者運行這個程序的時候是2022年7月30日,所以在日期的30后面加了一個*符號。
這個程序很簡單,但有些知識點我也會為大家詳細(xì)介紹,接下來按這個順序來為大家講解:
1. java.util.Calendar類的使用
2. 控制臺布局的設(shè)計
3. 程序分步實現(xiàn)
4. 完整代碼清單
5. 結(jié)束語
在Java類庫中有一個類:java.util.Calendar類,它是一個“抽象類”,它里面定義了一些方法,可以進行日期的運算,從而我們可以計算出某年某月的日歷。
通過API文檔我們可以發(fā)現(xiàn),Calendar類是一個“抽象類”,不能直接new對象,我們可以使用它的子類:java.util.GregorianCalendar,例如:
Calendar cal = new GregorianCalendar();
這種方式可以獲取封裝了當(dāng)前系統(tǒng)日期和時間的GregorianCalendar對象。當(dāng)然,它還有其它構(gòu)造方法,全部構(gòu)造方法如下圖:
在Calendar類中提供了一個get(int field)方法,可以獲取某個字段的值,例如,下例我們獲取這個GregorianCalendar對象的:年、月、日、小時、分、秒、星期等信息:
public class CalendarDemo01 { public static void main(String[] args) { //1.獲取Calendar的子類對象 Calendar gc = new GregorianCalendar(); System.out.println(gc); //2.成員方法:public int get(int field):獲取某個字段的值 int year = gc.get(Calendar.YEAR); int month = gc.get(Calendar.MONTH) + 1; int day = gc.get(Calendar.DAY_OF_MONTH); // int hour = gc.get(Calendar.HOUR);//12小時 int hour = gc.get(Calendar.HOUR_OF_DAY);//24小時 int minute = gc.get(Calendar.MINUTE); int second = gc.get(Calendar.SECOND); int week = gc.get(Calendar.DAY_OF_WEEK);//返回值:1--7,表示:星期日,星期一,星期二,...,星期六 System.out.println(year + "年" + month + "月" + day + "日 " + hour + ":" + minute + ":" + second); System.out.println(getWeek(week)); } //定義一個方法,接收一個int的值,返回:星期日,星期一,星期二,...,星期六 public static String getWeek(int w) {//1,2,3,4,5,6,7 //查表法 String[] weeks = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}; // 索引: [0] [1] [2] [3] [4] [5] [6] return weeks[w - 1]; } }
如果我們已有一個表示當(dāng)前系統(tǒng)日期和時間的GregorianCalendar對象,想計算1949年10月01日那天是星期幾,我們可以對這個GregorianCalendar對象的年、月、日重新設(shè)置。
Calendar類中提供了一個set(int field,int value)方法,可以設(shè)置某個字段的值。設(shè)置后,當(dāng)前對象的其它相關(guān)字段都會被設(shè)置到新設(shè)置的日期上,比如:設(shè)置了新的日期,"星期"字段會自動更改為新日期的星期值,示例代碼如下:
public class CalendarDemo02 { public static void main(String[] args) { //1.獲取Calendar的子類對象 Calendar gc = new GregorianCalendar(); System.out.println(gc); //2.成員方法:public void set(int field,int value):設(shè)置字段的值 //將gc對象設(shè)置為:1949年10月01日 gc.set(Calendar.YEAR, 1949); gc.set(Calendar.MONTH, 10- 1); gc.set(Calendar.DAY_OF_MONTH, 1); //3.獲取周幾 int w = gc.get(Calendar.DAY_OF_WEEK); String week1 = getWeek(w); System.out.println("1949年10月01日那天是:" + week1); } //定義一個方法,接收一個int的值,返回:星期日,星期一,星期二,...,星期六 public static String getWeek(int w) {//1,2,3,4,5,6,7 //查表法 String[] weeks = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}; // 索引: [0] [1] [2] [3] [4] [5] [6] return weeks[w - 1]; } }
如果我們已有一個表示當(dāng)前系統(tǒng)日期和時間的GregorianCalendar對象,想計算200天后的年、月、日、星期幾,我們可以使用add(int field,int value)方法,示例代碼如下:
public class CalendarDemo03 { public static void main(String[] args) { //1.獲取Calendar的子類對象 Calendar gc = new GregorianCalendar(); System.out.println(gc); //2.成員方法:public void add(int field,int value):增加/減少指定字段的值 //將日期增加200 gc.add(Calendar.DAY_OF_MONTH, 200); //3).獲取年、月、日,星期 int year = gc.get(Calendar.YEAR); int month = gc.get(Calendar.MONTH) + 1; int day = gc.get(Calendar.DAY_OF_MONTH); int w = gc.get(Calendar.DAY_OF_WEEK); System.out.println("200天后是:" + year + "年" + month + "月" + day + "日 " + getWeek(w)); } //定義一個方法,接收一個int的值,返回:星期日,星期一,星期二,...,星期六 public static String getWeek(int w) {//1,2,3,4,5,6,7 //查表法 String[] weeks = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}; // 索引: [0] [1] [2] [3] [4] [5] [6] return weeks[w - 1]; } }
Calendar和子類GregorianCalendar中還有很多其它方法,大家可以參考API文檔。
在控制臺上,如果想將多行的每列數(shù)據(jù)對齊,我們需要進行一些設(shè)計,主要是結(jié)合"空格"和"制表符"使多行中的多列數(shù)據(jù)實現(xiàn)對齊的效果。本例的設(shè)計思路如下圖:
說明:
根據(jù)上面的設(shè)計思路,我們就可以進行分步驟的編寫代碼了。
我們設(shè)計一個類CalendarShow,內(nèi)部包含一個成員屬性:GregorianCalendar對象,并且在構(gòu)造方法時為其初始化為當(dāng)前日期:
public class CalendarShow { private Calendar cal; public CalendarShow() { cal = new GregorianCalendar(); } public String toString() { StringBuilder sb = new StringBuilder(top() + "\n");//把top添加進來并換行 return sb.toString(); } private String top() { int year = cal.get(Calendar.YEAR);//獲取年 int month = cal.get(Calendar.MONTH) + 1;//獲取月 String yearOrMonth = year + "年" + month + "月";//年月字符串 String weekTop = "日\t一\t二\t三\t四\t五\t六";//日歷頭 return yearOrMonth + "\n" + weekTop; } public static void main(String[] args) { CalendarShow cs = new CalendarShow(); System.out.println(cs); } }
運行后,效果如下:
接下來我們填充下面的日期部分。
- 首先,我們先計算本月1日是星期幾:
int today = cal.get(Calendar.DAY_OF_MONTH);//獲取當(dāng)前是幾號 cal.set(Calendar.DAY_OF_MONTH, 1);//設(shè)置為本月一號 int weekOfOne = cal.get(Calendar.DAY_OF_WEEK);//獲取一號是周幾
由于我們要在"今天"的日期右側(cè)添加一個*符號,所以,在設(shè)置日期前,將當(dāng)前日期先取出。
- 獲取星期后,假如是星期五,那么為了在五的下面輸出1,我們先在前面的:日、一、二、三、四的每列上添加兩個空格和一個制表符:
for(int i = Calendar.SUNDAY; i < weekOfOne; i++) {//在一號前添加前置空格,使一號顯示在對應(yīng)的星期頭下方 sb.append(" \t"); }
- 輸出日期:
int month = cal.get(Calendar.MONTH);//獲取當(dāng)前是幾月 while(month == cal.get(Calendar.MONTH)) {//循環(huán)中會對日期不斷增加,當(dāng)增加到下個月時就跳出循環(huán) int day = cal.get(Calendar.DAY_OF_MONTH);//獲取當(dāng)前日期 if(day < 10) {//如果日期小于10,在前面加前導(dǎo)空格(填充補位的作用) sb.append(" " + day); } else { sb.append(day);//如果日期大于等于10,說明是兩位數(shù)的日期,無需添加空格 } if(day == today) {//如果日期是當(dāng)天,在后面添加星號和空格,表示當(dāng)天的意思 sb.append("* "); } else { sb.append("\t");//如果日期不是當(dāng)天,在后面添加一個制表符 } int week = cal.get(Calendar.DAY_OF_WEEK);//獲取當(dāng)前是星期幾 if(week == Calendar.SATURDAY) {//如果是星期六換行 sb.append("\n"); } cal.add(Calendar.DAY_OF_MONTH, 1);//把日期加1 } return sb.toString();
package com.heima.se; import java.util.Calendar; import java.util.GregorianCalendar; /** * 在控制臺打印日歷:要求使用的控制臺字體必須一個漢字的寬度對應(yīng)兩個字符的寬度。 * */ public class CalendarShow { private Calendar cal; public CalendarShow() { cal = new GregorianCalendar(); } public String toString() { StringBuilder sb = new StringBuilder(top() + "\n");//把top添加進來并換行 int today = cal.get(Calendar.DAY_OF_MONTH);//獲取當(dāng)前是幾號 cal.set(Calendar.DAY_OF_MONTH, 1);//設(shè)置為本月一號 int weekOfOne = cal.get(Calendar.DAY_OF_WEEK);//獲取一號是周幾 for(int i = Calendar.SUNDAY; i < weekOfOne; i++) {//在一號前添加前置空格,使一號顯示在對應(yīng)的星期頭下方 sb.append(" \t"); } int month = cal.get(Calendar.MONTH);//獲取當(dāng)前是幾月 while(month == cal.get(Calendar.MONTH)) {//循環(huán)中會對日期不斷增加,當(dāng)增加到下個月時就跳出循環(huán) int day = cal.get(Calendar.DAY_OF_MONTH);//獲取當(dāng)前日期 if(day < 10) {//如果日期小于10,在前面加前導(dǎo)空格(填充補位的作用) sb.append(" " + day); } else { sb.append(day);//如果日期大于等于10,說明是兩位數(shù)的日期,無需添加空格 } if(day == today) {//如果日期是當(dāng)天,在后面添加星號和空格,表示當(dāng)天的意思 sb.append("* "); } else { sb.append("\t");//如果日期不是當(dāng)天,在后面添加制表符 } int week = cal.get(Calendar.DAY_OF_WEEK);//獲取當(dāng)前是星期幾 if(week == Calendar.SATURDAY) {//如果是星期六換行 sb.append("\n"); } cal.add(Calendar.DAY_OF_MONTH, 1);//把日期加1 } return sb.toString(); } private String top() { int year = cal.get(Calendar.YEAR);//獲取年 int month = cal.get(Calendar.MONTH) + 1;//獲取月 String yearOrMonth = year + "年" + month + "月";//年月字符串 String weekTop = "日\t一\t二\t三\t四\t五\t六";//日歷頭 return yearOrMonth + "\n" + weekTop; } public static void main(String[] args) { CalendarShow cs = new CalendarShow(); System.out.println(cs); } }
在本文中,我們了解了Calendar及其子類GregorianCalendar的基本使用,以及對控制臺輸出內(nèi)容進行對齊的一些小技巧,通過這些,我們就可以很美觀的打印某年某月的一個日歷,是不是很酷!后續(xù)的文章,我會為大家?guī)砀?、更有趣、更實用的一些案例,請大家持續(xù)關(guān)注哦!