1. 程式人生 > >JAVA——有關日期時間的各種類

JAVA——有關日期時間的各種類

在java中有很多有關日期時間操作的類,這些類之間有什麼關係和區別呢?首先,來了解一下它們之間的繼承結構。

一、java.util.Date

構造方法

public Date()//當前時間
public Date(long date)//引數date是自 1970 年 1 月 1 日 00:00:00 GMT 以來的毫秒數。

常用方法

1.把此 Date 物件轉換為以下形式的 String: dow mon dd hh:mm:ss zzz yyyy 。

public String toString()

其中:

  • dow 是一週中的某一天 (Sun, Mon, Tue, Wed, Thu, Fri, Sat);
  • zzz 是時區(並可以反映夏令時)。標準時區縮寫包括方法 parse 識別的時區縮寫。如果不提供時區資訊,則 zzz 為空,即根本不包括任何字元。
  • yyyy 是年份,顯示為 4 位十進位制數。

重寫了Object的toString()方法。每次我們列印輸出java.util.Date型別的物件時,輸出的字串都不是標準的“2018-09-12 21:09:08”這樣的形式,而是這樣:

Thu Jan 15 14:51:54 CST 1970

就是因為Date物件呼叫了它的toString()方法。

2.設定Date物件的時間:

public void setTime(long time)

3.返回自 1970 年 1 月 1 日 00:00:00 GMT 以來此 Date 物件表示的毫秒數。

public long getTime()

二、java.sql.Date

為什麼要有java.sql.Date這個類呢?

我們發現除了父類Date在util包下,它的三個子類都是在sql包下的。因為在和資料庫打交道時(也就是在執行sql語句時),我們要用到sql包下的時間類,其他情況下我們通常用util包下的Date來格式化日期或者得到當前時間。為什麼和資料庫打交道時不能用java.util.Date?因為PreparedStatement有三個設定時間的方法:setDate()、setTime()、setTimeStamp(),這三個方法的第二個引數分別是java.sql.Date、java.sql.Time和java.sql.TimeStamp,並沒有提供引數是java.util.Date的方法。除此之外,ResultSet也有三個get()方法與之對應,且返回的時間型別也是sql包下的這三個類。

構造方法

public Date(long date)

與它父類的有參構造方法一樣。

常用方法

1.格式化日期轉義形式 yyyy-mm-dd 的日期。

public String toString()

重寫了父類的toString()方法,只返回日期,不返回時間。當我們列印java.sql.Date型別的物件時,會輸出這種形式:

1970-01-15

3. "yyyy-mm-dd" 形式的日期的 String 轉換為Date物件: 如果給定日期不是 轉義形式 (yyyy-mm-dd)會拋 

public static Date valueOf(String s)

2.與父類一樣擁有setTime()和getTime()方法。

三、java.sql.Time

構造方法

public Time(long time)

常用方法

1.重寫了toString()方法,對時間進行格式化,返回 hh:mm:ss 格式的 String。

public String toString()

2."hh:mm:ss" 格式的時間字串轉換為 Time ,格式錯誤會丟擲異常。

public static Time valueOf(String s)

3.同樣擁有getTime()和setTime()

四、java.sql.TimeStamp

構造方法

public Timestamp(long time)

常用方法

1.重寫了toString(),返回 yyyy-mm-dd hh:mm:ss.fffffffff 格式的 字串:

public String toString()

2.將" yyyy-mm-dd hh:mm:ss[.f...] "格式的字串轉換為 Timestamp物件:格式錯誤會拋異常

public static Timestamp valueOf(String s)

3.同樣擁有getTime()和setTime()方法。

五、操作資料庫用哪個類

看我們想要保留日期還是時間,如果只想保留日期,那麼用java.sql.Date獲取,如果只想保留時間,那麼用Time獲取,如果時間日期都要保留,那麼用TimeStamp獲取。另外,在簡單實體類中,日期屬性的型別一般習慣使用java.util.Date,因為它有無參構造,表達當前時間比較方便。所以要寫一個工具類來轉換sql包下的那三個類和java.util.Date。

示例:用sql包下的三個類分別獲取mysql中欄位為datetime值為2018-10-03 16:38:53的時間(由於資料庫連線程式碼太多,所以只貼重點程式碼)

                java.sql.Date date=rs.getDate("createDate");
                Date d1=new Date(date.getTime());
                System.out.println(d1);

                Time time=rs.getTime("createDate");
                Date d2=new Date(time.getTime());
                System.out.println(d2);

                Timestamp ts=rs.getTimestamp("createDate");
                Date d3=new Date(ts.getTime());
                System.out.println(d3);

執行結果:

Wed Oct 03 00:00:00 CST 2018
Thu Jan 01 16:38:53 CST 1970
Wed Oct 03 16:38:53 CST 2018

只有用TimeStamp獲取得到的時間才是完整的,Date獲取到的只有日期,Time獲取到的只有時間。

六、SimpleDateFormat

SimpleDateFormat是處理Date與String相互轉化格式的類。

構造方法(其中一個)

public SimpleDateFormat(String pattern)

引數pattern是描述日期和時間格式的字串

常用方法

1.將物件格式化為字串。如果該 SimpleDateFormat 物件不能格式化給定的物件則拋IllegalArgumentException

public final String format(Object obj)

2.將字串轉換為java.util.Date物件:

public Date parse(String source) throws ParseException

示例: 

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

public class Main {
    public static void main(String[] args) throws Exception {

        SimpleDateFormat format=new SimpleDateFormat("yyyy--MM--dd HH:mm:ss");
        String str=format.format(new Date());
        System.out.println(str);

        Date d=format.parse(str);
        System.out.println(d);

    }
}

執行結果:

2018--10--06 15:17:03
Sat Oct 06 15:17:03 CST 2018