1. 程式人生 > >Java 從入門到進階之路(二十)

Java 從入門到進階之路(二十)

在之前的文章我們介紹了一下 Java 中的包裝類,本章我們來看一下 Java 中的日期操作。

在我們日常程式設計中,日期使我們非常常用的一個操作,比如讀寫日期,輸出日誌等,那接下來我們就看一下 Java 中的日期操作。

 從上圖可以看出 Java 為我們提供了三個標準類庫來工我們使用,三個類庫之間在使用過程中又需要相互協作,接下來我們就一一看一下。

Java中的時間

  1、Java 中的時間使用標準類庫的 Date 類表示,是用距離一個固定時間點的毫秒數(可正可負,long 型別)表示一個特定的時間點;

  2、固定的時間點叫紀元(epoch),是 UTC 時間 1970年1月1日 00:00:00;

  3、UTC(Universal Time Coordinated 世界調整時間)與GMT(Greenwich Mean Time 格林威治時間)一樣,是一種具有實際目的的科學標準時間。

 1 import java.util.Date;
 2 
 3 /**
 4  * java.util.Date 包
 5  * Date 的每一個例項用於表示一個確切的時間點。
 6  * 內部維護了一個 long 值,該值記錄的是從:
 7  * 1970年1月1日 00:00:00 到表示的時間點之間所經歷的毫秒值。
 8  * 正數是 70 年以後的日期,負數是 70 年以前的日期
 9  * 由於 Date 設計上存在缺陷(時區,千年蟲),所以它的大部分方法被設定為"過時的",
10  * 不再建議使用
11  */
12 public class Main {
13     public static void main(String[] args) {
14         // 當前系統時間
15         Date now = new Date();
16         System.out.println(now); // Wed Dec 11 15:57:21 CST 2019  --對非英語地區很不友好
17 
18         /**
19          * Date 的大部分方法不建議使用了
20          * */
21         now.getYear(); // getYear 上面油條橫線,表示方法已不再建議使用
22         /**
23          * 獲取 Date 內部維護的 long 還可以使用
24          * */
25         long time = now.getTime();
26         System.out.println(time); // 1576053403721
27         /**
28          * void setTime(long)
29          * 設定一個 long 值,使 Date 表示該 long 值所表示的時間
30          * */
31         time += 24 * 60 * 60 * 1000; // 將 time 加 1 天的毫秒,即明天
32         now.setTime(time); // setTime() 可以將時間設定為我們規定的時間
33         System.out.println(now); // Thu Dec 12 16:39:54 CST 2019
34 
35     }
36 }

在上面的程式碼中,我們講解了一些關於 Date 的一些內容,可以看出 Date 已經不是很實用現在的程式設計,我們充其量也只是用一下 getTime 這個方法。下面我們來看一下 SimpleDateFormat

SimpleDateFormat 可以根據一個給定的日期格式將 String 和 Date 想換轉換,格式如下:

現在我們就根據上面的轉換格式輸出一下當前時間,程式碼如下:

 1 import java.text.ParseException;
 2 import java.text.SimpleDateFormat;
 3 import java.util.Date;
 4 
 5 /**
 6  * java.util.SimpleDateFormat 包
 7  * 根據一個給定的日期格式將 String 與 Date 相互轉換
 8  */
 9 public class Main {
10     public static void main(String[] args) throws ParseException {
11         // 當前系統時間
12         Date now = new Date();
13         System.out.println(now); // Wed Dec 11 16:50:42 CST 2019
14 
15         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
16 
17         /**
18          * 將 String 轉為 Date
19          * String format(Date date)
20          * format 方法可以將給定的 date 物件所表示的時間
21          * 按照 SimpleDateFormat 制定的日期格式轉換為字串
22          */
23         String str = sdf.format(now);
24         System.out.println(str); // 2019-12-12 11:10:53
25 
26         /**
27          * 將 Date 轉為 String
28          * Date parse(String str)
29          * parse 方法可以將給定的 str 按照 SimpleDateFormat 制定的
30          * 日期格式解析為一個 Date 物件
31          */
32         Date date = sdf.parse(str);
33         System.out.println(date); // Thu Dec 12 11:47:09 CST 2019
34     }
35 }

在上面的程式碼中,我們實現了 Date 與 String 之間的互轉,需要注意的是在使用 parse 方法時需要先丟擲異常,這個我們在之後的內容中會詳細講解異常的處理。

接下來我們再來看一下時間操作中的 Calender,

 

 1 import java.util.Calendar;
 2 import java.util.Date;
 3 
 4 /**
 5  * java.util.Calender 包
 6  * 日曆類
 7  * 該類事一個抽象類,封裝了對時間的相關操作
 8  * 常用的實現類格力高裡歷(陽曆)
 9  * 使用日曆類是為了對時間進行相關的操作
10  * 比如計算時間
11  */
12 public class Main {
13     public static void main(String[] args) {
14         /**
15          * 使用 Calender 的靜態方法建立例項,
16          * 該方法會根據當前系統所在時區建立一個相應的實現
17          * 通常是 GregorianCalender
18          * 預設建立的日曆例項表示當前系統時間
19          * */
20         Calendar calendar = Calendar.getInstance();
21         // toString 不能直觀反映表示的日期
22         System.out.println(calendar); // java.util.GregorianCalendar[time=1576134924891,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=2019,MONTH=11,WEEK_OF_YEAR=50,WEEK_OF_MONTH=2,DAY_OF_MONTH=12,DAY_OF_YEAR=346,DAY_OF_WEEK=5,DAY_OF_WEEK_IN_MONTH=2,AM_PM=1,HOUR=3,HOUR_OF_DAY=15,MINUTE=15,SECOND=24,MILLISECOND=891,ZONE_OFFSET=28800000,DST_OFFSET=0]
23 
24         /**
25          * Calender 與 Date 之間的互轉
26          * Calender -> Date
27          * Date getTime()
28          * Calender 提供了方法 getTime()
29          * 該方法返回一個 Date 物件,該物件表示的時間就是
30          * 當前 Calender 表示的時間
31          */
32         Date date = calendar.getTime();
33         System.out.println(date); // Thu Dec 12 15:18:56 CST 2019
34 
35         /**
36          * Date -> Calender
37          * Void setTime(Date date)
38          * Calender 的 setTime 方法可以使當前
39          * Calender 表示給定的 Date 所表示的時間
40          */
41         calendar.setTime(date);
42     }
43 }

當然 Calender 提供了針對不同時間分量單獨設定的值,如下:

 1 import java.util.Calendar;
 2 
 3 /**
 4  * Calender 提供了針對不同時間分量單獨設定值的方法
 5  * void set(int filed, int value)
 6  * 其中第一個引數為:時間分量,例如:年,月,日等等
 7  * 第二個引數為對應的值
 8  * 時間分量是一個 int 值,使用 Calender 提供的常量
 9  */
10 public class Main {
11     public static void main(String[] args) {
12         Calendar calendar = Calendar.getInstance();
13         System.out.println(calendar.getTime()); // Thu Dec 12 16:33:06 CST 2019
14 
15         // 設定 Calender,使其表示 2008-08-08 20:08:08
16         // 設定年
17         calendar.set(Calendar.YEAR, 2008);
18         System.out.println(calendar.getTime()); // Fri Dec 12 16:33:06 CST 2008
19 
20         // 設定月
21         calendar.set(Calendar.MONTH, 7); // 月是從 0 開始的
22         calendar.set(Calendar.MONTH, Calendar.AUGUST); // 也可以使用常量表示月
23         System.out.println(calendar.getTime()); // Tue Aug 12 16:50:43 CST 2008
24 
25         /**
26          * 設定日
27          * 對應的時間分量常用的
28          * DATE:月中天
29          * DAY_OF_MONTH:月中的天,與DATE一致
30          * DAY_OF_WEEK:週中的天,星期幾
31          * DAY_OF_YEAR:年中的天
32          * */
33         calendar.set(Calendar.DATE, 8);
34         System.out.println(calendar.getTime()); // Fri Aug 08 17:01:48 CST 2008
35 
36         // 設定小時
37         calendar.set(Calendar.HOUR, 8);
38         System.out.println(calendar.getTime()); // Fri Aug 08 08:35:45 CST 2008
39 
40         // 設定分
41         calendar.set(Calendar.MINUTE, 8);
42         System.out.println(calendar.getTime()); // Fri Aug 08 08:08:45 CST 2008
43 
44         // 設定秒
45         calendar.set(Calendar.SECOND, 8);
46         System.out.println(calendar.getTime()); // Fri Aug 08 08:08:08 CST 2008
47     }
48 }

在上面的程式碼中,我們可以根據 set 方法來設定任意我們想要的時間分量。

當然,我們既可以單獨設定時間分量,也可以單獨獲取時間分量,如下:

 1 import java.util.Calendar;
 2 
 3 /**
 4  * 獲取一個 Calender 表示的日期中
 5  * 各個時間分量對應的值
 6  * int get(int filed)
 7  * 獲取對應時間分量的值
 8  */
 9 public class Main {
10     public static void main(String[] args) {
11         Calendar calendar = Calendar.getInstance();
12 
13         // 獲取年
14         int year = calendar.get(Calendar.YEAR);
15         System.out.println(year); // 2019
16 
17         // 獲取月
18         int month = calendar.get(Calendar.MONTH) + 1; // 月是從 0 開始
19         System.out.println(month); // 12
20 
21         // 獲取周
22         int week = calendar.get(Calendar.DAY_OF_WEEK) - 1; // 周是從週日開始的
23         System.out.println(week == 0 ? 7 : week); // 5
24         String[] data = {"日","一","二","三","四","五","六"};
25         System.out.println(data[week]); // 五
26 
27         // 獲取日
28         int date = calendar.get(Calendar.DATE);
29         System.out.println(date); // 13
30     }
31 }

接下來我們再來看一下 Calender 中的時間計算:

 1 import java.util.Calendar;
 2 
 3 /**
 4  * Calender 中計算時間的方法
 5  * void add(int field, int value)
 6  * 對指定的時間分量加上給定的值,若給定的值是負數
 7  * 則是減去給定的值
 8  */
 9 public class Main {
10     public static void main(String[] args) {
11         Calendar calendar = Calendar.getInstance();
12         // 檢視3年2月1天后的日期
13 
14         // 檢視 3 年後
15         calendar.add(Calendar.YEAR, 3);
16         System.out.println(calendar.getTime()); // Tue Dec 13 10:59:29 CST 2022
17 
18         // 檢視 2 月後
19         calendar.add(Calendar.MONTH, 2);
20         System.out.println(calendar.getTime()); // Mon Feb 13 10:59:29 CST 2023
21 
22         // 檢視 1 天后
23         calendar.add(Calendar.DAY_OF_YEAR, 1);
24         System.out.println(calendar.getTime()); // Tue Feb 14 10:59:29 CST 2023
25     }
26 }