Java日期時間


Java的java.util包提供了Date類,該類封裝了當前的日期和時間。Date類支援兩個建構函式,如下表所示。

編號 建構函式 描述
1 Date() 此建構函式使用當前日期和時間來初始化物件。
2 Date(long millisec) 此建構函式接受一個引數,該引數等於自1970年1月1日午夜以來經過的毫秒數。

以下是Date類的方法列表 -

編號 方法 描述
1 boolean after(Date date) 如果呼叫Date物件包含的日期晚於date指定的日期,則返回true,否則返回false
2 boolean before(Date date) 如果呼叫Date物件包含的日期早於date指定的日期,則返回true,否則返回false
3 Object clone( ) 複製呼叫的Date物件。
4 int compareTo(Date date) 將呼叫物件的值與date的值進行比較。 如果值相等則返回0。 如果呼叫物件早於date,則返回負值。 如果呼叫物件晚於date,則返回正值。
5 int compareTo(Object obj) 如果obj物件是Date類物件,則與compareTo(Date)操作相同。 否則,它會丟擲ClassCastException
6 boolean equals(Object date) 如果呼叫Date物件包含與date指定的時間和日期相同的時間和日期,則返回true,否則返回false
7 long getTime() 返回自1970年1月1日以來經過的毫秒數。
8 int hashCode() 返回撥用物件的雜湊碼。
9 void setTime(long time) 設定時間指定的時間和日期,表示從1970年1月1日午夜開始的經過時間(以毫秒為單位)。
10 String toString( ) 將呼叫Date物件轉換為字串並返回結果。

1. 獲取當前日期和時間

這是一種在Java中獲取當前日期和時間的簡單方法。可以使用Date物件toString()方法來列印當前日期和時間,如下所示 -

import java.util.Date;
public class Test {

   public static void main(String args[]) {
      // 範例化Date物件
      Date date = new Date();

      // display time and date using toString()
      System.out.println(date.toString());
   }
}

執行上面範例程式碼,得到以下結果:

Fri Mar 15 13:00:37 CST 2020

2. 使用SimpleDateFormat設定日期格式

SimpleDateFormat是一個具體的類,用於以區域設定的方式格式化和解析日期。 SimpleDateFormat用於從為日期時間格式選擇使用者定義的模式。

範例

import java.text.SimpleDateFormat;
import java.util.Date;

public class Test {

    public static void main(String args[]) {
        Date dNow = new Date();
        SimpleDateFormat ft = new SimpleDateFormat("yyyy.MM.dd (E)'at' hh:mm:ss a zzz");

        System.out.println("Current Date: " + ft.format(dNow));

        SimpleDateFormat ft2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

        System.out.println("Current Datetime: " + ft2.format(dNow));

    }
}

執行上面範例程式碼,得到以下結果:

Current Date: 2019.03.15 (星期五)at 01:04:52 下午 CST
Current Datetime: 2019-03-15 01:04:52

DateFormat格式程式碼

要指定時間格式,請使用時間模式字串。 在此模式中,所有ASCII字母都保留為模式字母,其定義如下 -

編號 字元 描述 示全殲
1 G 時代指示符 AD
2 y 四位數的年份值 2019
3 M 月份 July or 07
4 d 10
5 h 小時 A.M./P.M. (1~12) 12
6 H 24小時製的小時表示 (0~23) 22
7 m 分鐘 30
8 s 秒鐘 55
9 S 毫秒 234
10 E 星期幾 Tuesday
11 D 一年中的第幾天 360
12 F 一個月中的某一天 2 (second Wed. in July)
13 w 一年中的第幾個星期 40
14 W 一月中的第幾個星期 1
15 a A.M./P.M. 標記 PM
16 k 小時 (1~24) 24
17 K 小時 A.M./P.M. (0~11) 10
18 z 時區 Eastern Standard Time
19 跳脫文字 Delimiter
20 ` 單引號 `

3. 使用printf格式化日期

使用printf方法來完成日期和時間格式化。使用雙字母格式,以t開頭並以表格的一個字母結尾,如下面的程式碼所示。

import java.text.SimpleDateFormat;
import java.util.Date;

public class Test {

    public static void main(String args[]) {
        // Instantiate a Date object
        Date date = new Date();

        // display time and date
        String str = String.format("Current Date/Time : %tc", date);

        System.out.printf(str);

    }
}

執行上面範例程式碼,得到以下結果:

Current Date/Time : 星期五 三月 15 13:18:24 CST 2019

如果多次提供日期來格式化每個部分,那多少會有點愚蠢。 格式字串可以指示要格式化的引數的索引。

索引必須緊跟%,並且必須以$結尾。

範例

import java.text.SimpleDateFormat;
import java.util.Date;

public class Test {

    public static void main(String args[]) {
        // Instantiate a Date object
        Date date = new Date();

        // display time and date
        System.out.printf("%1$s %2$tB %2$td, %2$tY", "Due date:", date);
    }
}

執行上面範例程式碼,得到以下結果:

Due date: 三月 16, 2019

或者,可以使用<標誌。 它表示再次使用與前面的格式規範相同的引數。

import java.text.SimpleDateFormat;
import java.util.Date;

public class Test {

    public static void main(String args[]) {
        // Instantiate a Date object
        Date date = new Date();

        // display formatted date
        System.out.printf("%s %tB %<te, %<tY", "Due date:", date);
    }
}

執行上面範例程式碼,得到以下結果:

Due date: 三月 16, 2019

4. 日期和時間轉換字元

範例

編號 字元 描述 範例
1 c 完全日期和時間 Mon May 04 09:51:52 CDT 2019
2 F ISO 8601 date 2004-02-09
3 D U.S. formatted date (month/day/year) 02/09/2004
4 T 24小時時間 18:05:19
5 r 12小時時間 06:05:19 pm
6 R 24小時時間, 無秒鐘。 18:05
7 Y 四位數年份(前導零) 2019
8 y 年份的最後兩位數(帶前導零) 19
9 C 年份的前兩位數(帶前導零) 20
10 B 月份全名稱 February
11 b 縮寫的月份名稱 Feb
12 m 兩位數月份(帶前導零) 02
13 d 兩位數的日期(帶前導零) 03
14 e 兩位數的日期(沒有前導零) 9
15 A 完整的工作日名稱 Monday
16 a 縮寫的工作日名稱 Mon
17 j 一年中的三位數日(帶前導零) 069
18 H 兩位數小時(前導零),介於00和23之間 18
19 k 兩位數小時(不帶前導零),介於0和23之間 18
20 I 兩位數小時(前導零),介於01和12之間 06
21 l 兩位數小時(不帶前導零),介於1和12之間 6
22 M 兩位數分鐘(帶前導零) 05
23 S 兩位數秒(帶前導零) 19
24 L 三位數毫秒(帶前導零) 047
25 N 九位納秒(帶前導零) 047000000
26 P 大寫上午或下午標記 PM
27 p 小寫上午或下午標記 pm
28 z GMT的RFC 822數位偏移量 -0800
29 Z 時區 PST
30 s 自1970-01-01 00:00:00 GMT以來的秒數 1078884319
31 Q 自1970-01-01 00:00:00 GMT以來的毫秒數 1078884319047

還有其他與日期和時間相關的有用類。 有關更多詳細資訊,請參閱Java標準文件。

5. 將字串解析為日期

SimpleDateFormat類有一些額外的方法,特別是parse(),它用於根據儲存在給定的SimpleDateFormat物件中的格式來解析字串。

範例

import java.util.*;
import java.text.*;

public class Test {

    public static void main(String args[]) {
        SimpleDateFormat ft = new SimpleDateFormat("yyyy-MM-dd");
        String input = args.length == 0 ? "2019-11-11" : args[0];

        System.out.print(input + " 解析為:");
        Date t;
        try {
            t = ft.parse(input);
            System.out.println(t);
        } catch (ParseException e) {
            System.out.println("Unparseable using " + ft);
        }
    }
}

執行上面範例程式碼,得到以下結果:

2019-11-11 解析為:Mon Nov 11 00:00:00 CST 2019

6. 睡眠一段時間

可以在計算機生命週期的任何時間段內睡眠。 例如,以下程式將睡眠3秒鐘 -

import java.util.*;
import java.text.*;

public class Test {

    public static void main(String args[]) {
        try {
            System.out.println(new Date());
            Thread.sleep(5 * 60 * 10);
            System.out.println(new Date());
        } catch (Exception e) {
            System.out.println("Got an exception!");
        }
    }
}

執行上面範例程式碼,得到以下結果:

Sat Mar 16 15:51:43 CST 2019
Sat Mar 16 15:51:46 CST 2019

7. 測量經過的時間

有時,可能需要以毫秒為單位測量時間點。 重寫上面的例子 -

import java.util.*;
import java.text.*;

public class Test {

    public static void main(String args[]) {
        try {
            long start = System.currentTimeMillis();
            System.out.println(new Date());

            Thread.sleep(5 * 60 * 10);
            System.out.println(new Date());

            long end = System.currentTimeMillis();
            long diff = end - start;
            System.out.println("時間差為: " + diff);
        } catch (Exception e) {
            System.out.println("Got an exception!");
        }
    }
}

執行上面範例程式碼,得到以下結果:

Sat Mar 16 15:53:25 CST 2019
Sat Mar 16 15:53:28 CST 2019
Difference is : 3021