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