1.Date
類和Unix時間
從 Java 一開始,該語言就有一個用於處理時間和日期的特殊類 — Date
. 隨著時間的推移,出現了更多用於處理日期的類,但Date
即使在今天,程序員仍在繼續使用該類。
這是因為它非常簡單方便。而作為一個程序員,你肯定會在任何一個真實的項目中遇到它。是否使用它是您的選擇,但您必須知道它。所以給它幾分鐘寶貴的時間。
是什麼讓Date
課堂如此精彩?它的簡單性。
該類Date
將日期和時間信息存儲為自 1970 年 1 月 1 日以來經過的毫秒數。這是很多毫秒,因此該long
類型用於存儲它們。
為什麼特別是從 1970 年開始?這就是所謂的Unix 時間:所有現代操作系統的鼻祖 Unix 操作系統就是這樣計時的。
但是您可以很容易地找出兩個日期之間經過了多少時間:只需從另一個日期中減去一個日期,您就可以得到日期之間的時差,精確到毫秒。
這裡有一些與班級一起工作的有用例子Date
。
2.獲取當前日期
要獲取當前時間和日期,只需創建一個Date
對象。每個新對像都存儲其創建時間。它看起來很簡單:
Date current = new Date();
執行此命令後,current
變量將存儲對已創建對象的引用Date
,該對象將在內部存儲其創建時間——自 1970 年 1 月 1 日起經過的毫秒數。
在屏幕上顯示當前日期
要顯示當前日期,只需:a) 創建一個新Date
對象,b) 使用方法將其打印到屏幕上System.out.println()
。
例子:
代碼 | 控制台輸出 |
---|---|
|
|
以下是控制台輸出的含義:
文本 | 解釋 |
---|---|
星期四_ | 週四 |
2月21日 | 2月21日 |
14:01:34 | 小時 : 分鐘 : 秒 |
歐洲東部時間 | 時區:東歐時間 |
2019 | 年 |
3. 設定具體日期
我們想出瞭如何獲取當前時間,但我們如何創建一個Date
存儲不同日期或時間的對象呢?
同樣,這裡的一切都很簡單。要設置特定日期,您需要編寫如下代碼:
Date birthday = new Date(year, month, day);
一切都簡單明了,但有兩個細微差別需要注意:
- 年份必須從1900年開始計算。
- 月份從零開始編號。
這是 Unix 操作系統的另一個遺產:在 Unix 上,程序員使用兩位數字表示年份。他們沒有寫 1977,而是簡單地寫了 77。因此,如果我們從 1900 年算起,77 是正確的年份。
比如我是1989年3月21日出生的,3月是第三個月,所以需要寫:
代碼 | 控制台輸出 |
---|---|
|
|
月份是從零開始編號的,但日子不是,這有點奇怪,對吧?
我們認為真正的程序員應該佔上風,並從零開始計算一個月中的天數。哦,這些循規蹈矩的人🙂
設定特定時間
設置特定時間也很簡單:為此,您需要編寫如下語句:
Date birthday = new Date(year, month, day, hour, minutes, seconds);
小時、分鐘和秒從零開始編號:讓您內心的程序員鬆一口氣。
例子:
代碼 | 控制台輸出 |
---|---|
|
|
我們設置時間12:15和日期June 4, 2005。對於非程序員來說,這有點難以閱讀,但它可以正常工作。
4. 處理日期元素
您可以對對像做更多的Date
事情,而不僅僅是顯示它。它有一些方法可以讓您獲取內部存儲日期的各個元素:
方法 | 描述 |
---|---|
|
返回日期相對於 1900 年的年份。 |
|
返回日期的月份(月份從零開始編號) |
|
返回一個月中的第幾天 |
|
返回星期幾 |
|
返回小時數 |
|
返回分鐘 |
|
返回秒數 |
例子:
代碼 | 控制台輸出 | 筆記 |
---|---|---|
|
|
2005 年 6 月 星期六 |
順便說一句,一個Date
對像不僅可以讓你獲得日期的各個元素,還可以改變它們:
方法 | 描述 |
---|---|
void setYear(int year) |
更改日期的年份。年份是相對於 1900 年表示的。 |
void setMonth(int month) |
更改日期的月份(月份從零開始編號) |
void setDate(int date) |
更改月份中的日期 |
void setHours(int hours) |
更改時間 |
void setMinutes(int minutes) |
更改分鐘 |
void setSeconds(int seconds) |
秒變 |
5. 毫秒
正如我們之前所說,該Date
對象存儲自 1970 年 1 月 1 日以來經過的毫秒數。
如果我們需要那個數字,我們可以從對像中獲取它Date
:
long time = date.getTime();
該getTime()
方法返回存儲在對象內的毫秒數Date
。
您不僅可以獲得毫秒數,還可以在現有對像中更改該數字:
Date date = new Date();
date.setTime(1117876500000L);
順便說一句,您可以通過Date
在創建對象時將時間傳遞給對象來更簡潔地編寫它:
Date date = new Date(1117876500000L);
6.比較日期
如果你想比較兩個日期並找出哪個日期先到,你有三種選擇
第一種方式是簡單比較它們各自存儲的毫秒數:
if (date1.getTime() < date2.getTime())
第二種方式是使用對象before()
的方法Date
:
if (date1.before(date2))
它是這樣寫的:如果date1
出現在 之前date2
,那麼......
第三種方式是使用對象after()
的方法Date
:
if (date2.after(date1))
它是這樣寫的:如果date2
在之後date1
,那麼......
7.DateFormat
類
記住,當我們在屏幕上顯示日期時,我們看到了這樣的東西:Thu Feb 21 14:01:34 EET 2019
。一切似乎都是正確的,但格式更像是為程序員而不是普通人顯示日期的方式。我們希望為用戶更清楚地顯示日期。類似的東西Tuesday, February 21
。
並且沒有年份。或如有必要,一年。通常,我們希望能夠以不同的方式顯示日期。
為此有一個特殊的類:SimpleDateFormat
.
例子:
代碼 |
---|
|
控制台輸出 |
|
查看程序顯示的內容:Jun-04-2005
。這根本不是過去的樣子。
不同的是,我們顯示的不是對象本身,而是通過調用對象的方法Date
獲得的特殊字符串。但這甚至不是這裡的重點。format()
SimpleDateFormat
SimpleDateFormat
創建對象時,我們將字符串"MMM-dd-YYYY"
作為參數傳入。正是這個字符串傳達了我們最終在控制台輸出中看到的日期格式。
- MMM 表示顯示月份名稱,用三個字母縮寫
- dd 表示顯示月中的第幾天
- YYYY表示用四位數字顯示年份
如果我們想將月份輸出為數字,那麼MMM
我們需要寫,而不是MM
,這會產生模式"MM-dd-YYYY"
。屏幕輸出將是06-04-2005
稍後我們將更詳細地討論這個類。
8.Date.parse
方法
該類Date
可以做一些其他有趣且有用的事情——它可以從字符串中獲取日期。或者,如程序員所說,它可以解析一個字符串。
parse()
它對此有特殊的方法。解析看起來像這樣:
Date date = new Date();
date.setTime( Date.parse("Jul 06 12:15:00 2019") );
順便說一句,這段代碼可以寫得更緊湊:
Date date = new Date("Jul 06 12:15:00 2019");
我們將在其他課程中更詳細地考慮字符串的解析。
GO TO FULL VERSION