天天看點

jdbc讀取mysql時分秒yyyy-mm-dd hh:_JDBC中日期時間的處理技巧

基礎知識

Java中用類java.util.Date對日期/時間做了封裝,此類提供了對年、月、日、時、分、秒、毫秒以及時區的控制方法,同時也提供一些工具方法,比如日期/時間的比較,前後判斷等。

java.util.Date中采用一個long型的數來儲存日期/時間,它表示從格林威治時間1970年1月1日00點00分00秒至今的毫秒數。

JDBC中,在這個類的基礎之上擴充了3個類:

java.sql.Date,

java.sql.Time,

java.sql.Timestamp

java.sql.Date表示日期,隻包括年月日;

java.sql.Time表示時間,隻包括時分秒;

java.sql.Timestamp表示時間戳,包括年月日,時分秒,還有毫秒和納秒;值得注意的是它比java.util.Date還多了一個納秒。

這3個類分别對應資料庫的3種資料類型:

java.sql.Date 日期(隻包括年月日)

java.sql.Time 時間(隻包括時分秒)

java.sql.Timestamp 日期/時間(包括年月日,時分秒,還有毫秒和納秒)

java.sql.Date構造函數

jdbc讀取mysql時分秒yyyy-mm-dd hh:_JDBC中日期時間的處理技巧

java.util.Date構造函數

jdbc讀取mysql時分秒yyyy-mm-dd hh:_JDBC中日期時間的處理技巧

擷取目前時間

1.通過Util包中的Date擷取

Date date = new Date();

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

System.out.println(dateFormat.format(date));

2.通過Util包的Calendar 擷取

Calendar calendar= Calendar.getInstance();

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

System.out.println(dateFormat.format(calendar.getTime()));

3.通過Util包的Calendar 擷取時間,分别擷取年月日時分秒

Calendar cal=Calendar.getInstance();

int y=cal.get(Calendar.YEAR);

int m=cal.get(Calendar.MONTH);

int d=cal.get(Calendar.DATE);

int h=cal.get(Calendar.HOUR_OF_DAY);

int mi=cal.get(Calendar.MINUTE);

int s=cal.get(Calendar.SECOND);

System.out.println("現在時刻是"+y+"年"+m+"月"+d+"日"+h+"時"+mi+"分"+s+"秒");

通過sql包擷取目前時間

java.sql包下給出三個與資料庫相關的日期時間類型:

Date:表示日期,隻有年月日,沒有時分秒。會丢失時間;

Time:表示時間,隻有時分秒,沒有年月日。會丢失日期;

Timestamp:表示時間戳,有年月日時分秒,以及毫秒。

//擷取目前時間java.sql.Date

java.sql.Date sqlDate=new java.sql.Date(new java.util.Date().getTime());

System.out.println(sqlDate);//2020-06-23

java.sql.Time sTime=new java.sql.Time(new java.util.Date().getTime());

System.out.println(sTime);//10:29:19

java.sql.Timestamp stp=new java.sql.Timestamp(new java.util.Date().getTime());

System.out.println(stp);//2020-06-23 10:29:19.329

Util包和sql包之間互相轉換

System.out.println("*********util.Date轉sql.Date*********");

Date utilDate = new Date();//util.Date

System.out.println("utilDate : " + utilDate);

Timestamp sqlDate = new Timestamp(utilDate.getTime());//util.Date轉sql.Date

System.out.println("sqlDate : " + sqlDate);

System.out.println("*********sql.Date轉util.Date*********");

System.out.println("sqlDate : " + sqlDate);

Date date = new Date(sqlDate.getTime());//sql.Date轉util.Date

System.out.println("utilDate : " + date);

運作結果:

*********util.Date轉sql.Date*********

utilDate : Tue Jun 23 10:36:24 CST 2020

sqlDate : 2020-06-23 10:36:24.917

*********sql.Date轉util.Date*********

sqlDate : 2020-06-23 10:36:24.917

utilDate : Tue Jun 23 10:36:24 CST 2020

處理技巧。

1.對于資料庫種不同的時間類型,要分别采用與之相對應的Java包裝類來存取

日期類型用java.sql.Date,時間類型用java.sql.Time,日期/時間類型用java.sql.Timestamp;

這裡舉個例子:假設要從oracle中擷取系統時間,需要執行sql:select sysdate from dual,然後在通過ResultSet擷取查詢結果時,一定要調用方法:getTimestamp(),這樣才可以把年月日時分秒都取出來,調用getDate()隻能取出年月日,調用getTime()隻能取出時分秒。調用getString也可以取出來,但是存在問題,見技巧2。

2.盡量不要調用getString()來擷取日期/時間類型的資料

調用getString()也可以取出時間類型的資料,JDBC在内部将日期/時間轉換為字元串;但是這個字元串的格式卻取決于資料庫,用Oracle是一種,用Sybase又是一種,mysql又是一種,如果你想相容多種資料庫,還是不要用getString()的好。

另外,采用字元串來儲存時間存在一些問題,還有是效率問題,用getString()需要在内部将日期時間轉換為字元串,涉及字元串處理;但用getTimestamp()隻需要做整數的運算和處理;而整數的運算處理一般都比字元串處理效率高。

3.如何将JDBC的日期/時間類型轉換為字元串

曾經看到過有人這樣寫:

java.sql.Timestamp timeStamp = //通過資料庫通路擷取到該資料

java.util.Date utilDate = new java.util.Date(timeStamp.getTime());

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String str = sdf.format(utilDate);

這樣也可以達到最終目的,但是有點問題,java.sql.Timestamp是繼承java.util.Date的,是以format的時候直接傳入timeStamp即可,沒有必要臨時建立一個utilDate。像下面這樣就可以了:

java.sql.Timestamp timeStamp = //通過資料庫通路擷取到該資料

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

String str = sdf.format(timeStamp);

如果是java.sql.Date或java.sql.Time,也是同樣的道理。

4.在做select、update或insert時,如果某個字段為日期/時間類型,最好用PreparedStatement,而不要采用Statement

經常會看到這樣的程式:

Connection conn;//前面的步驟略

Statement stmt = conn.createStatement();

stmt.execute("insert into tab ( begin_date ) values ( TO_Date( '06/27/2005 12:59:52', 'MM/DD/YYYY HH24:MI:SS'))");

熟悉oracle的人都知道,To_Date是oracle裡的函數,其他資料庫沒有,即使有也很可能不一樣。那麼這段代碼隻能用在oracle上,如果換成其他資料庫,程式就無法執行了。

如果采用PreparedStatement,代碼是這樣:

Connection conn;//前面的步驟略

PreparedStatement pstmt = conn.prepareStatement("insert into tab ( begin_date ) values( ?)");

pstmt.setTimestamp(1, new Timestamp(System.currentTimeMillis()));

pstmt.execute();

可以看出來,這段代碼與資料庫無關,隻要是支援标準sql的資料庫都沒有問題。

客戶是上帝,想用什麼資料庫,我們就得支援什麼資料庫,為了避免以後的麻煩,還是用PreparedStatement的好。

5.存儲過程的參數,該用日期/時間類型的就要用,不要一味的都采用字元串型

存儲過程,隻要是日期/時間,都采用字元串類型(varchar2或其它)。這樣會造成很多麻煩。

首先,需要約定字元串格式,調用者和被調用者都必須遵循這個格式,這種約定很容易受人為因素影響;

其次,存儲過程中需要對字元串做分析,合法性檢查等,增加了編碼的難度和負責度;

再者,這些額外的代碼,降低的程式的效率,增加了資料庫的負擔。

采用日期/時間類型來作為存儲過程的參數,可以降低編碼的難度,從邏輯上看起來更清晰,而且運作效率高。

在JDBC中采用CallableStatement來調用存儲過程,對日期/時間的輸入和輸出,可以采用setTimestamp,getTimestamp,setDate,getDate,setTime,getTime。

6.java.sql.Timestamp如何轉換為java.util.Date?

java.sql.Timestamp是java.util.Date的子類,不需要做任何轉換直接指派即可:

java.sql.Timestamp ts = new java.sql.Timestamp();

java.util.Date utilDate = new java.util.Date();

utilDate = ts;

java.sql.Date和java.sql.Time也是一樣的道理。

7.java.util.Date如何轉換為java.sql.Timestamp?

java.util.Date是java.sql.Timestamp的父類,不能像技巧6那樣做了。要這樣:

java.sql.Timestamp ts = new java.sql.Timestamp();

java.util.Date utilDate = new java.util.Date utilDate();

ts.setTime(utilDate.getTime());

java.sql.Date和java.sql.Time也是一樣的道理。