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()

例子:

代碼 控制台輸出
Date current = new Date();
System.out.println(current);
Thu Feb 21 14:01:34 EET 2019

以下是控制台輸出的含義:

文本 解釋
星期四_ 週四
2月21日 2月21日
14:01:34 小時 : 分鐘 : 秒
歐洲東部時間 時區:東歐時間
2019

3. 設定具體日期

我們想出瞭如何獲取當前時間,但我們如何創建一個Date存儲不同日期或時間的對象呢?

同樣,這裡的一切都很簡單。要設置特定日期,您需要編寫如下代碼:

Date birthday = new Date(year, month, day);

一切都簡單明了,但有兩個細微差別需要注意:

  1. 年份必須從1900年開始計算。
  2. 月份從零開始編號。
有趣的。

這是 Unix 操作系統的另一個遺產:在 Unix 上,程序員使用兩位數字表示年份。他們沒有寫 1977,而是簡單地寫了 77。因此,如果我們從 1900 年算起,77 是正確的年份。

比如我是1989年3月21日出生的,3月是第三個月,所以需要寫:

代碼 控制台輸出
Date current = new Date(89, 2, 21);
System.out.println(current);
Tue Mar 21 00:00:00 EET 1989

月份是從零開始編號的,但日子不是,這有點奇怪,對吧?

我們認為真正的程序員應該佔上風,並從零開始計算一個月中的天數。哦,這些循規蹈矩的人🙂

設定特定時間

設置特定時間也很簡單:為此,您需要編寫如下語句:

Date birthday = new Date(year, month, day, hour, minutes, seconds);

小時、分鐘和秒從零開始編號:讓您內心的程序員鬆一口氣。

例子:

代碼 控制台輸出
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current);
Sat Jun 04 12:15:00 EEST 2005

我們設置時間12:15和日期June 4, 2005。對於非程序員來說,這有點難以閱讀,但它可以正常工作。


4. 處理日期元素

您可以對對像做更多的Date事情,而不僅僅是顯示它。它有一些方法可以讓您獲取內部存儲日期的各個元素:

方法 描述
int getYear()
返回日期相對於 1900 年的年份。
int getMonth()
返回日期的月份(月份從零開始編號)
int getDate()
返回一個月中的第幾天
int getDay()
返回星期幾
int getHours()
返回小時數
int getMinutes()
返回分鐘
int getSeconds()
返回秒數

例子:

代碼 控制台輸出 筆記
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current.getYear());
System.out.println(current.getMonth());
System.out.println(current.getDate());
System.out.println(current.getDay());

105
5
4
6

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.

例子:

代碼
Date current = new Date(105, 5, 4, 12, 15, 0);
SimpleDateFormat formatter = new SimpleDateFormat("MMM-dd-YYYY");
String message = formatter.format(current);
System.out.println(message);
控制台輸出
Jun-04-2005

查看程序顯示的內容: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");

我們將在其他課程中更詳細地考慮字符串的解析。