Java中Date插入數據庫的一些問題總結(二)
關於java.sql.Date中插入/提取數據庫中 Date類型的date值–帶有時分秒的方法java
———————————–樓主舒適提示:如下內容能夠忽略,直接從下個分割線閱讀——————————–
書上一個項目把我給坑到了~此項目用java.sql.Date類,而後存入導出的日期是沒有時間。出於優化的心態,我就想着看能不能把時分秒給加上,本覺得是很簡單的轉換問題,結果一坑我就是半天~~
先看數據庫裏,date是datetime類型,存入的數據只有年月日,時間都是00:00:00;當時的我覺得是簡單的格式轉換問題(受教育了~下次得把問題歸結清楚,一通亂搞只會愈來愈亂~)就尋思着把時間獲取而後從新轉換一下格式,再存入不就OK了?如此一來存入數據庫和導出展現都變成了美觀的」yyyy-MM-dd HH:mm:ss」格式(2016-03-15 15:52:48)sql
原語句獲取時間的代碼是數據庫
setDate(new Date(System.currentTimeMills());
做爲小白,只管百度,而後套用,這是一向規律~因而搜索到了SimpleDateFormat對象,二話不說,開始套用,套用!而後一下午過去了~事情也沒有解決。只能先把大概的收穫總結一下:
1:System.currentTimeMillis() 返回long類型 能夠強制轉換成Date格式
2:SimpleDateFormat.format()返回的是 String類型,能夠獲得我上述的時間格式,可是是String類型。
3:SimpleDateFormat.parse()返回的是Date類型,該方法試圖按照給定的SimpleDateFormat 對象的格式化存儲來解析字符串,試事後發現,解析後的值是「格林威治時間格式「,即我當初設想的思路應該不能實現,轉而改變策略,以任意格式把時間變成Date格式插入數據庫中,提取的時候再作變換便可。
4:查詢中發現java.util.Date 和 java.sql.Date存在一些區別,util.date用Date date = new Date(),util能夠活動值,sql包必須給參數。
看來今天搞不定了,實在頭大,休息了先。markdown
———————————-這裏!這裏!我是下一個分割線T。T——————————–jsp
接昨天的話。今兒請教了一下師兄們。算是解決了這個問題。
回頭看這事的出現到解決,其實問題蠻多的。大體可分爲
1. java.sql.Date 和 java.util.Date包之間的區別
2. 日期的類型轉換之間的問題,String、Date、Long、Timestamp
3. 日期的格式化轉變問題
—-這麼些個問題堆在一塊兒,讓小白我感受錯綜複雜,以至於煩躁、慌亂,解決問題的方向也發生誤差。比如這日期的格式化轉變,我把它和類型轉換一塊兒作,甚至於還沒搞明白什麼類型就開始格式轉換,繞來繞去得不到想要的結果。優化
今兒,翻看了一遍,問題本源是–「數據庫在插入date類型的date時會出現時分秒丟失」形成的,而非date的類型轉換致使。如下的內容就是如何保證date的插入和提取都帶有時分秒;this
正題開始:回憶下昨天的結果是得到了一個Date型的格林威治時間,插入數據庫就只剩下年月日了,提取顯示出來也只有年月日。我作的這個系統,把時間從獲取到顯示一共是經歷了這麼些步驟:
1.用戶觸發某事件後,系統來獲取當前時間spa
ly.setDate(new Date(System.currentTimeMillis())); ```
2.以後轉到DB類的addInfo()方法,向數據庫裏插入日期,我是用prepareStatement執行的SQL語句 設計
static PreparedStatement pstmt; pstmt.setDate(1,new Date(System.currentTimeMillis()));
3.插入後再從數據庫讀出來,用DB.findInfo()方法code
ly.setDate(rs.getDate(1));
4.而後main.jsp上獲取顯示,等因而這麼4個步驟
<td><%=ly.getUserId()%></td>
如今分析步驟1這裏的date值是OK的,date類型的包含時分秒的時間,而後到了步驟2,插入能夠看到數據庫沒有時分秒了,這裏查詢了下。
java.sql.date 是爲了數據庫而設計的 是java.util.date 的子類。 數據庫有date和datetime類型,前者是不帶時分秒,後者帶時分秒。此外不論是java.sql.date仍是 java.util.date 存儲爲date是會丟失時分秒! java.sql.date 中1.若是數據庫使用的是 getDate() 無疑沒有時分秒,由於數據庫沒有 2.若是數據庫使用的是getTimestamp,時分秒就不會丟失
咱們能夠看到不論是java.sql.date仍是 java.util.date下把Date類型的date值,直接插入數據庫確實會丟失掉時分秒。問題出在這裏,就得百度想對策了,這時候發現同上文說的同樣,能夠用Timestamp來作,改爲以下
ly.setDate(new Timestamp(System.currentTimeMillis()));
這裏先貼一下兩個方法,
private Date date; public Date getDate() { return date; } public void setDate(Date date) { this.date = date;
能夠看到以前這裏date的get和set方法都是用Date類型來作的,如今既然改爲Timestamp型了,這裏也得更改
private Timestamp timestamp; public Timestamp getDate() { return timestamp; } public void setDate(Timestamp timestamp) { this.timestamp = timestamp; }
這一下步驟1又OK了,能夠插入了,而後還得改下步驟2的方法,pstmt的setDate() 得改爲前面談到的 setTimestamp()
pstmt.setTimestamp(1,new Date(System.currentTimeMillis()));
到了這裏,寫入部分OK了。作讀取的話,咱們還要繼續修改步驟3,要把setDate改了,以下作相應的修改。
ly.setDate(rs.getTimestamp(3));
寫完後運行應該OK了,不過會發現時間的精度好高,如這樣:2016-03-16 15:23:07.223
這裏咱們再作轉化,DB類中寫一個dateChange()格式轉化方法
public String dateChange(Timestamp timestamp){ try { SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String ss = sdf.format(timestamp); return ss; } catch (Exception e) { e.printStackTrace(); } return null; }
用SimpleDateFormat對象設置自定義的時間格式,調用format()方法轉換出結果(這裏結果是String型),而後步驟4改爲
<td><%=new DB().dateChange(ly.getDate())%></td>
到這裏就一切OK啦~輸出時間格式:2016-03-16 15:23:07
哎呀呀~真的感受寫一篇記錄解決問題的博客確實不如總結知識點來的輕巧~~以前的語序好亂,改了半天,但願能夠幫到一些遇到一樣問題的朋友們。若有問題,歡迎留言~謝謝~