各種時間型別的轉換及比較

happyAliceYu發表於2017-07-21

     我們常用的時間型別不外乎 Date型別,但是想要獲取更精準的時間,則需要DateTime或者Timestamp型別。

    下面先簡單說一下這三種型別的格式及時間範圍:

    1.Date: 年/月/日    時間範圍:公元100年1月1日 0:00:00 ~ 9999年12月31日 23:59:59)

     Fri Jul 21 15:33:05 CST 2017(獲得date)      2017-33-21 15:07:05  (格式化後)

MySQL用'YYYY-MM-DD'格式檢索和顯示DATE值

     2.Datetime: MySQL檢索並且以'YYYY-MM-DD HH:MM:SS'格式顯示DATETIME值,支援的範圍是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。

一些符號標識:

   3.Timestamp:時間戳是指格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現在的總秒數

               預設值:0000-00-00-00.00.00.000000   格式:yyyy-MM-dd HH:mm:ss.fff

 4.TIME資料型別表示一天中的時間。MySQL檢索並且以"HH:MM:SS"格式顯示TIME值。支援的範圍是'00:00:00'到'23:59:59'。

  • y : 年
  • M : 月
  • d:日
  • hH:小時
  • m:分鐘
  • s:秒
  • t:12小時制的上下午(AM/PM)
  • z:時區

下面是這幾種型別的相互轉換:

一、String與Date(java.util.Date)互轉

     1.1 String -> Date

  1. String dateStr = "2010/05/04 12:34:23";   
  2.         Date date = new Date();   
  3.         //注意format的格式要與日期String的格式相匹配   
  4.         DateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");   
  5.         try {   
  6.             date = sdf.parse(dateStr);   
  7.             System.out.println(date.toString());   
  8.         } catch (Exception e) {   
  9.             e.printStackTrace();   
  10.         }  

  1.2 Date -> String

   日期向字串轉換,可以設定任意的轉換格式format

  1. String dateStr = "";   
  2.         Date date = new Date();   
  3.         //format的格式可以任意   
  4.         DateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");   
  5.         DateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH/mm/ss");   
  6.         try {   
  7.             dateStr = sdf.format(date);   
  8.             System.out.println(dateStr);   
  9.             dateStr = sdf2.format(date);   
  10.             System.out.println(dateStr);   
  11.         } catch (Exception e) {   
  12.             e.printStackTrace();   
  13.         }  

 二、String與Timestamp互轉

 (Timestamp的值從資料庫取出展示在前臺有可能是一串數字,此時需要轉換為String型別即可以正常顯示)

   2.1 String ->Timestamp

   使用Timestamp的valueOf()方法

  1. Timestamp ts = new Timestamp(System.currentTimeMillis());   
  2.         String tsStr = "2011-05-09 11:49:45";   
  3.         try {   
  4.             ts = Timestamp.valueOf(tsStr);   
  5.             System.out.println(ts);   
  6.         } catch (Exception e) {   
  7.             e.printStackTrace();   
  8.         }  

   注:String的型別必須形如: yyyy-mm-dd hh:mm:ss[.f...] 這樣的格式,中括號表示可選,否則報錯!!!

    如果String為其他格式,可考慮重新解析下字串,再重組~~

    2.2 Timestamp -> String

  使用Timestamp的toString()方法或者借用DateFormat

 

  1. Timestamp ts = new Timestamp(System.currentTimeMillis());   
  2.         String tsStr = "";   
  3.         DateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");   
  4.         try {   
  5.             //方法一   
  6.             tsStr = sdf.format(ts);   
  7.             System.out.println(tsStr);   
  8.             //方法二   
  9.             tsStr = ts.toString();  
  10.             System.out.println(tsStr);   
  11.         } catch (Exception e) {   
  12.             e.printStackTrace();   
  13.         }  

 很容易能夠看出來,方法一的優勢在於可以靈活的設定字串的形式。

三、Date( java.util.Date )和Timestamp互轉

  宣告:查API可知,Date和Timesta是父子類關係

  3.1 Timestamp -> Date

  1. Timestamp ts = new Timestamp(System.currentTimeMillis());   
  2.         Date date = new Date();   
  3.         try {   
  4.             date = ts;   
  5.             System.out.println(date);   
  6.         } catch (Exception e) {   
  7.             e.printStackTrace();   
  8.         }  

 很簡單,但是此刻date物件指向的實體卻是一個Timestamp,即date擁有Date類的方法,但被覆蓋的方法的執行實體在Timestamp中。

   3.2 Date -> Timestamp

   父類不能直接向子類轉化,可藉助中間的String~~~~

     java.sql.Date 只儲存日期資料不儲存時間資料
    // 會丟失時間資料
    preparedStatement.setDate(1, new java.sql.Date(date.getTime()));
     //可以這樣來處理
      preparedStatement.setTimestamp(1, new java.sql.Timestamp(new java.util.Date().getTime()));

      //想要得到完整的資料,包括日期和時間,可以這樣
      java.util.Date d = resultSet.getTimestamp(1);
      //這樣處理更合適一些,可以避免一些潛在Timestamp 問題
     java.util.Date d = new java.util.Date(resultSet.getTimestamp(1).getTime());
自己補的話
這樣的話:
        往資料庫儲存的時候可以接收 java.util.Date型別 再用getTime()方法得到代表那個Date物件的long值,再以這個long值 構造一個Timestamp物件 存進資料庫中。
       從存資料庫裡取的時候,可以先得到Timestamp用他的getTime()方法得到long值,再以這個long值構造一個java.util.Date物件,這樣就可以對這個Date物件操作了。不如說 new SimpleTimeFormat("yyyyy-MM-dd HH:mm:ss").format()等等

二:時間型別之間的大小比較

1.Date型別compareTo方法

含義:實際上比較的是自1970 年 1 月 1 日 00:00:00 GMT以來的毫秒數。毫秒數越大的時間越大

引數 Date 等於此 Date,則返回值 0;如果此 Date 在 Date 引數之前,則返回小於 0 的值;如果此 Date 在 Date 引數之後,則返回大於 0 的值

2.Timestamp型別getTime()方法

2個timestamp型別的資料不能直接用><=比較大小

可以用下面的方法比較

[html] view plain copy
  1. var timestamp1;  
  2. var timestamp2;  
  3. if( timestamp1.getTime() > timestamp2.getTime())  
這樣加上getTime()方法後就可比較了(返回對應的毫秒數(long型別)

註釋:      1. java.util.Date類中的getYear()要加上1900才可得到實際值,getMonth()則要加上1。
        2. 字元串到Date的轉換: Date.valueOf(str),記得引包的時候要引sql的Date包,不是util的Date包
        3. 字串到Timestamp 的轉換Timestamp ts = Timestamp.valueOf(time);

相關文章