Java中 util 包 Calendar類製作萬年曆(不用自己寫方法,直接用Java寫好的包中的類的方法)
- 2020 年 10 月 9 日
- 筆記
- Java util 包, util包Calendar類
程式碼前需要了解的關於Calendar類的內容:
1、在util包中,首先要知道Calendar
提供了一個類方法 getInstance
,以獲得此類型的一個通用的對象。Calendar
的 getInstance
方法返回一個 Calendar
對象,其日曆欄位已由當前日期和時間初始化:
Calendar rightNow = Calendar.getInstance();
得到的結果為:
java.util.GregorianCalendar[time=1602247844439,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id=”Asia/Shanghai”,offset=28800000,dstSavings=0,useDaylight=false,transitions=19,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2020,MONTH=9,WEEK_OF_YEAR=41,WEEK_OF_MONTH=2,DAY_OF_MONTH=9,DAY_OF_YEAR=283,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=8,HOUR_OF_DAY=20,MINUTE=50,SECOND=44,MILLISECOND=439,ZONE_OFFSET=28800000,DST_OFFSET=0]
very very長的結果,裡面的主要內容是啥呢,英語好的朋友根據每個單詞的英文應該都能夠理解了,而我的準確時間應該是:2020-10-09 星期五 20:50:44,而在粉紅色記號中會發現,上面寫的是9月9日 星期四。
為啥是這樣呢?因為在Java中,Month 值是基於 0 的,例如:0 表示 January(1月);而一周呢是從周日開始的,所以1表示Friday。
因此當運行 Calendar rightNow = Calendar.getInstance(); 輸出時,得到的月份和星期數是有差異的。
那我們如何將它換成我們自己常用的格式呢,使用
System.out.println(calendar.get( Calendar.YEAR)+”年 “
+ ( calendar.get( Calendar.MONTH) +1 ) +”月”
+ calendar.get( Calendar.DAY_OF_MONTH ) +”日 “
+ calendar.get( Calendar.HOUR_OF_DAY ) +”:”+calendar.get(Calendar.MINUTE) +”: “+calendar.get(Calendar.SECOND)
+ ” 星期 “+( calendar.get( Calendar.DAY_OF_WEEK ) -1 ) );
就可以得到:
2020年 10月9日 21: 23: 13 星期 5
2、Calendar
類是一個抽象類,這就意味著我們使它時不能實例化它,意思就是不能直接new 它,只能對它的子類進行實例化,我們已知它的子類為:GregorianCalendar ,public class GregorianCalendarextends Calendar,GregorianCalendar
是 Calendar
的一個具體子類,提供了世界上大多數國家/地區使用的標準日曆系統。
正式開始程式:
1 package com.zrx.case02;
2
3 import java.util.Calendar;
4 import java.util.Scanner;
5
6 public class Test02 {
7
8 public static void main(String[] args) {
9 Calendar calendar = Calendar.getInstance();
10 // System.out.println(calendar);
11 System.out.println(calendar.get(Calendar.YEAR)+"年 "
12 + ( calendar.get(Calendar.MONTH) +1 ) +"月"
13 + calendar.get(Calendar.DAY_OF_MONTH) +"日 "
14 + calendar.get(Calendar.HOUR_OF_DAY) +": "+calendar.get(Calendar.MINUTE) +": "+calendar.get(Calendar.SECOND)
15 + " 星期"+( calendar.get(Calendar.DAY_OF_WEEK) -1 ));
16
17 //修改年份
18 calendar.set(Calendar.YEAR, 2017);
19 System.out.println(calendar.get(Calendar.YEAR)+"年 "
20 + ( calendar.get(Calendar.MONTH) +1 ) +"月"
21 + calendar.get(Calendar.DAY_OF_MONTH) +"日 "
22 + calendar.get(Calendar.HOUR_OF_DAY) +": "+calendar.get(Calendar.MINUTE) +": "+calendar.get(Calendar.SECOND)
23 + " 星期"+( calendar.get(Calendar.DAY_OF_WEEK) -1 ));
24
25 //根據日曆規律
26 calendar.add(Calendar.YEAR, 3);
27 System.out.println(calendar.get(Calendar.YEAR)+"年 "
28 + ( calendar.get(Calendar.MONTH) +1 ) +"月"
29 + calendar.get(Calendar.DAY_OF_MONTH) +"日 "
30 + calendar.get(Calendar.HOUR_OF_DAY) +": "+calendar.get(Calendar.MINUTE) +": "+calendar.get(Calendar.SECOND)
31 + " 星期"+( calendar.get(Calendar.DAY_OF_WEEK) -1 ));
32
33 System.out.println("--------------------------------------------------------------------------");
34
35
36 //完成萬年曆
37 Scanner sc = new Scanner(System.in);
38 int year = 0;
39 int month = 0;
40 do {
41 System.out.println("請輸入年份:");
42 year = sc.nextInt();
43 }while(year<1970);
44 do {
45 System.out.println("請輸入月份:");
46 month = sc.nextInt();
47 }while(month<1 || month>12);
48
49 Calendar c = Calendar.getInstance();
50 c.set(Calendar.YEAR, year);
51
52 c.set(Calendar.MONTH, month); //此時month要多一個月,因為從0開始
53 c.set(Calendar.DAY_OF_MONTH, 1); //則為下個月的一號
54
55 c.add(Calendar.DAY_OF_MONTH, -1); //減一天後變為當月的最後一天
56 int days = c.get(Calendar.DAY_OF_MONTH); //獲取當月的天數
57
58 //設置當前月份的一號
59 c.set(Calendar.DAY_OF_MONTH,1);
60 //獲取1號是星期幾
61 int weekDay = c.get(Calendar.DAY_OF_WEEK);
62 //按格式輸出日曆
63 System.out.println("周天\t周一\t周二\t周三\t周四\t周五\t周六\t");
64 for(int i = 2; i<=weekDay;i++) {
65 System.out.print("\t");
66 }
67 for(int i = 1; i<=days ;i++) {
68 System.out.print(i+"\t");
69 if( (( i+weekDay) -1)%7 == 0 ) {
70 System.out.println();
71 }
72 }
73 }
74 }
有個疑問,我其中一個語句,原來寫的是:
//按格式輸出日曆
63 System.out.println("周天\t周一\t周二\t周三\t周四\t周五\t周六\t");
64 for(int i = 1; i<=weekDay;i++) {
65 System.out.print("\t");
66 }
67 for(int i = 1; i<=days ;i++) {
68 System.out.print(i+"\t");
69 if( (( i+weekDay) -1)%7 == 0 ) {
70 System.out.println();
71 }
72 }
但是輸出後格式錯誤,根據幾次調試(瞎蒙),把int i = 1;改成 int i = 2;後,最後上面最終程式碼部分列印出來的格式是正確的,為啥呢?
—在學習使用Java中各位大佬已經寫好的類包的遇見啥不會使用的時候,要會靈活運用JDK API幫助文檔,可以學到很多簡便快捷的方法
—-本次學習文字內容是根據JDK 1.6.0 API幫助文檔中文版摘抄總結的。