Java中 util 包 Calendar類製作萬年曆(不用自己寫方法,直接用Java寫好的包中的類的方法)

 程式碼前需要了解的關於Calendar類的內容:

   

   1、在util包中,首先要知道Calendar 提供了一個類方法 getInstance,以獲得此類型的一個通用的對象。CalendargetInstance 方法返回一個 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 CalendarGregorianCalendar 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幫助文檔中文版摘抄總結的。