1.班級轉Date班級Calendar

程序員喜歡這個Date類,因為它的簡單性和對 Unix 標準的支持,但如您所知,每朵玫瑰都有刺。

程序員想要一個“智能”Date類。他們以課堂的形式得到了他們想要的東西Calendar。它被認為是一種不僅可以存儲日期,還可以對日期執行困難操作的方法。

該類的全名Calendar是 java.util.Calendar。如果您決定在代碼中使用它,請不要忘記將它添加到導入語句中。

您可以使用以下命令創建Calendar對象:

Calendar date = Calendar.getInstance();

該類的靜態getInstance()方法Calendar創建一個Calendar用當前日期初始化的對象。您想要的日曆將根據運行該程序的計算機的設置創建。

或者更準確地說,你得到的日曆……那是因為地球上的人類並不局限於單一的日曆。相反,他們使用了很多。幾乎每個人都與某種宗教或國家有關。該類Calendar支持其中的 3 個:

日曆 描述
公曆 基督教公曆
佛歷 佛歷
日本皇曆 日本皇曆

但也有中國和阿拉伯日曆。基本上,處理時間並不像看起來那麼容易。

在編寫本課程時,中國曆法的正式年份是 4716。根據伊斯蘭歷,年份是 1398 年。歡迎來到大世界,我的程序員朋友。

2.創建一個日曆對象

我們將使用公曆,因為它是世界上最通用的。至少在中國購買甲骨文並將中國日曆作為主要日曆之前。

您可以使用如下語句創建具有任何日期的日曆對象:

Calendar date = new GregorianCalendar(year, month, day);

是的,你必須GregorianCalendar每次都寫。除了Calendar,您還可以編寫GregorianCalendar— 這也行得通。但是寫作只是Calendar更短。

年份必須全寫,例如,您不能用 19 代替 2019。月份仍然從零開始編號。但和以前一樣,一個月中的天數不是從零開始編號的。書呆子!

要設置時間和日期,您需要將時間作為附加參數傳遞:

... = new GregorianCalendar(year, month, day, hours, minutes, seconds);

如果需要,您甚至可以以毫秒為單位傳遞。它們是秒數之後的參數。

3. 在屏幕上顯示一個日曆對象

如果您只是在屏幕上打印一個日曆對象,您將不會對結果很滿意。

代碼
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar);
控制台輸出
java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Helsinki",offset=7200000,dstSavings=3600000,useDaylight=true,transitions=118,lastRule=java.util.SimpleTimeZone[id=Europe/Helsinki,offset=7200000,dstSavings=3600000,useDaylight=true,startYear=0,startMode=2,startMonth=2,startDay=-1,startDayOfWeek=1,startTime=3600000,startTimeMode=2,endMode=2,endMonth=9,endDay=-1,endDayOfWeek=1,endTime=3600000,endTimeMode=2]],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=?,YEAR=2019,MONTH=3,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=12,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]

這裡要記住的是日曆是日曆,而不是日期:它有各種設置,都會顯示在屏幕上。

SimpleDateFormat用一個對象來顯示日曆是合適的,但在我們研究它之前,你可以使用這個生活技巧。

Date date = calendar.getTime();

對象Calendar可以很容易地轉換為Date對象,並且您已經知道如何顯示Date對象。您可以使用這樣的代碼將Calendar對象轉換為Date

使用getTime()方法:

代碼 控制台輸出
Calendar calendar = new GregorianCalendar(2019, 03, 12);
System.out.println(calendar.getTime());
 Fri Apr 12 00:00:00 EEST 2019

那是完全不同的事情,不是嗎?

4. 處理日期元素

要獲取日期的特定元素(例如年、月、...),該類Calendar具有get()方法。這是一個單一的方法,但它有參數:

int month = calendar.get(Calendar.MONTH);

其中calendarCalendar變量,MONTH是類的常量字段Calendar

您將類的常量字段之一Calendar作為參數傳遞給該get方法,並獲得所需的值作為結果。

例子

代碼 描述
Calendar calendar = Calendar.getInstance();

int era = calendar.get(Calendar.ERA);
int year = calendar.get(Calendar.YEAR);
int month = calendar.get(Calendar.MONTH);
int day = calendar.get(Calendar.DAY_OF_MONTH);

int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);
int hour = calendar.get(Calendar.HOUR);
int minute = calendar.get(Calendar.MINUTE);
int second = calendar.get(Calendar.SECOND);


紀元( 在 共同
紀元 之前 或 之後)






要更改日期的元素,請使用以下set方法:

calendar.set(Calendar.MONTH, value);

其中calendarCalendar變量,MONTH是類的常量字段Calendar

使用set方法時,將類的一個Calendar常量字段作為第一個參數傳遞,將新值作為第二個參數傳遞。

例子

代碼 描述
Calendar calendar = new GregorianCalendar();

calendar.set(Calendar.YEAR, 2019);
calendar.set(Calendar.MONTH, 6);
calendar.set(Calendar.DAY_OF_MONTH, 4);
calendar.set(Calendar.HOUR_OF_DAY, 12);
calendar.set(Calendar.MINUTE, 15);
calendar.set(Calendar.SECOND, 0);

System.out.println(calendar.getTime());


年 = 2019
月 = 七月(從 0 開始編號)
第 4 天
小時
分鐘

5.Calendar類的常量

該類的常量字段Calendar不限於用於命名日期元素的字段。似乎有適合各種場合的場地。

Calendar date = new GregorianCalendar(2019, Calendar.JANUARY, 31);

例如,有常量字段來引用月份:

還有星期幾:

Calendar calendar = new GregorianCalendar(2019, Calendar.JANUARY, 31);
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.FRIDAY)
{
   System.out.println("It's Friday");
}

我們不會列出所有內容。如果您在代碼中看到這樣的常量,我們只是不想讓您感到驚訝。

使用常量使代碼更具可讀性,這就是程序員使用它們的原因。月份從零開始編號也是為了提高可讀性。或不。

Calendar6. 更改對像中的日期

該類Calendar有一個方法可以讓您以更智能的方式處理日期。例如,您可以向日期添加年、月或幾天。或者把他們帶走。此方法稱為add()。使用它看起來像這樣:

calendar.add(Calendar.MONTH, value);

其中calendarCalendar變量,MONTH是類的常量字段Calendar

使用方法時,將類的一個常量字段作為第一個參數和第二個參數(要添加的新值)add傳遞。Calendar

這是另一種智能方法。讓我們看看它有多聰明:

代碼
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.DAY_OF_MONTH, 2);
System.out.println(calendar.getTime());
控制台輸出
Fri Mar 01 00:00:00 EET 2019

此方法了解 2019 年 2 月只有 28 天,因此結果日期為 3 月 1 日。

現在讓我們帶走2個月!我們應該得到什麼?2018 年 12 月 27 日!我們現在檢查一下。

要執行導致更早日期的操作,您需要將負值傳遞給該add()方法:

代碼
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.add(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
控制台輸出
Thu Dec 27 00:00:00 EET 2018

有用!

這種方法考慮了月份和閏年的不同長度。總而言之,一個很棒的方法。這正是大多數使用日期的程序員所需要的。

7.日期的滾動元素

但有時在某些情況下我們不希望這種聰明的行為,例如,您想對日期的一部分做一些事情而不改變其他一切。

該類為此Calendar提供了特殊方法。roll()它的簽名就像add()方法一樣,但是這個方法只改變日期的一個元素,其餘的保持不變。

例子:

代碼
Calendar calendar = new GregorianCalendar(2019, Calendar.FEBRUARY, 27);
calendar.roll(Calendar.MONTH, -2);
System.out.println(calendar.getTime());
控制台輸出
Fri Dec 27 00:00:00 EET 2019

我們更改了月份,但年份和日期保持不變。