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