關於編程語言中的時間格式和關係型數據中的中時間格式問題的轉化一直都是個簡單而又不得不權衡的問題,這牽扯到數據庫設計和SQL編程和應用程序中時間格式數據的處理的編程,二者總可以交纏在一塊兒。java
關於Java中的時間格式和數據庫中的時間格式轉換在這裏先寫兩個方法:sql
- /**
- *
- * @param utilDate
- * @return
- */
- public static java.sql.Date convertUtilDateToSqlDate(java.util.Date utilDate) {
- java.sql.Date sqlDate = new java.sql.Date(utilDate.getTime());
- return sqlDate;
- }
- /**
- *
- * @param sqlDate
- * @return
- */
- public static java.util.Date convertSqlDateToUtilDate(java.sql.Date sqlDate){
- java.util.Date utilDate =new java.util.Date(sqlDate.getTime());
- return utilDate;
- }
普通的轉換是很容的,可是想要獲取到必定的格式就得下些功夫了。數據庫
1.從應用程序中向數據庫中寫入字段類型爲Date類型的數據
編程
好比:PreparedStatement.setDate(int ,java.sql.Date)方法 說明:其中的java.sql.Date能夠用上面的方法轉化獲得服務器
好比:TO_DATE(new SimpleDateFormat().format(ud,"yyyy-MM-dd HH:mm:ss"),"YYYY- MM-DD HH24:MI:SS")
能夠經過SQL語句進行處理:SQL=「UPDATE TABLENAME SET TIMER = TO_DATE(" "+ TIMEMISS +" ", ' yyyymmddhh24miss' ) WHERR ... 」 注 TIMEMISS 爲變量 例如:20080522131223 類型數據庫設計
2. 將指定格式的字符串轉換爲數據庫的時間類型java.sql.Date
經過以下方法能夠實現:編程語言
方法一:
ide
- public static java.sql.Date convertStringToSqlDate(String formatStr, String timeStr) {
- SimpleDateFormat bartDateFormat = new SimpleDateFormat(formatStr);
- java.sql.Date sqlDate = null;
- try {
- java.util.Date date = bartDateFormat.parse(timeStr);
- sqlDate = new java.sql.Date(date.getTime());
- System.out.println(sqlDate.getTime());
- } catch (Exception ex) {
- System.out.println(ex.getMessage());
- }
- return sqlDate;
- }
方法二:
工具
- String strDate = "2002-08-09";
- StringTokenizer st = new StringTokenizer(strDate, "-");
- java.sql.Date date = new java.sql.Date(Integer.parseInt(st.nextToken()));
這樣經過不一樣的方式均可以解決這個問題。
3.關於java.sql.Date與java.sql.Date
java.sql.Date是爲了配合SQLDATE而設置的數據類型。
「規範化」的java.sql.Date只包含年月日信息,時分秒毫秒都會清零。格式相似:YYYY-MM-DD。
當咱們調用ResultSet的getDate()方法來得到返回值時,java程序會參照"規範"的java.sql.Date來格式化數據庫中的數值。所以,若是數據庫中存在的非規範化部分的信息將會被劫取。 this
在sun提供的ResultSet.java中這樣對getDate進行註釋的:
Retrieves the of the designated column in the current row of this <code>ResultSet</code> object as a 「java.sql.Date」 object in the Java programming language.
若是咱們把一個java.sql.Date值經過PrepareStatement的setDate方法存入數據庫時,java程序會對傳入的java.sql.Date規範化,非規範化的部分將會被劫取。然而,咱們java.sql.Date通常由java.util.Date轉換過來,如:java.sql.Date sqlDate=new java.sql.Date(new java.util.Date().getTime()).
顯然,這樣轉換過來的java.sql.Date每每不是一個規範的java.sql.Date.要保存java.util.Date的精確值,這個時候java.sql.Timestamp.算是一個比較好的選擇。
4.一刀切的作法
關於這個作法曾經在我身邊發生過一些小小的爭議,有一個老師告訴咱們在數據庫中使用時間類型的時候通通設置爲字符串類型,而另外一個老師是在應用程序開發的告訴咱們那樣設計數據庫表字段是最不專業的作法。但是最後發現若是在應用程序中將時間數據做爲java.util.Date,而在數據庫中時間數據字段類型爲Date類型,那麼在進行時間數據更新或者查詢方面都將是上面一大堆的轉化方式顯的格外有意義。
後來將這個問題想了想,爲何沒有爲關於這兩個類型作一個適配器的東西類進行轉換,這樣不是更方便了。
如今彷佛明白了些。若是數據庫中是時間字段的更新來自數據庫服務器的操做,那麼大可放心的使用數據庫中的時間類型,並且從數據庫中讀出數據在應用程序中轉換至關容易和自由;相反,若是數據庫中的時間字段的更新來自外部應用程序,那麼能夠將數據庫中的時間類型字段設計爲字符串類型,由於對於數據庫來說它是服務於應用程序的,並且這樣來自外部的時間格式將更容易控制和設置。
5.能夠一勞永逸
粗略的想一下沒有相似時間格式的轉換是應爲咱們在實際應用中須要展示的時間格式顯示是變幻無窮的,所以只能經過對特定的業務需求進行分析編寫一個工具類來處理這些問題,固然這樣的工做也是一勞永逸的。
這裏列一個處理:
- //得到當前時間,聲明時間變量
- Calendar calendar = Calendar.getInstance();
- //獲得年
- int year = calendar.get(Calendar.YEAR);
- //獲得月,可是,月份要加上1
- int month = calendar.get(Calendar.MONTH) + 1;
- //得到日期
- int day = calendar.get(Calendar.DATE);
- //字符串轉換成日期時間格式
- String today = "" + year + "-" + month + "-" + day + "";
好了,時間很少了,一勞永逸是創建在高度的抽象再抽象,分析提取在分析的基礎上的。