2012-11-20 47 views
1

我有這個處理ResultSet的Java方法。爲什麼這個SimpleDateFormat失去了關於時間的信息?

protected void populateDto(String[] rowSet, ResultSet rs, String[] columunsNames) throws SQLException { 
    for (int i = 0; i < rowSet.length; i++) { 
     rowSet[i] = rs.getString(columunsNames[i]); 
    } 
} 

正如你可以看到所有的結果被視爲字符串類型(getString用於任何列類型)。遇到日期列時,它會自動轉換爲字符串。得到的日期將出現類似於此:

2012-08-01 16:10:47.0

我已經修改了上面的腳本,創建類似的東西:

protected void populateDto(String[] rowSet, ResultSet rs, String[] columunsNames) throws SQLException { 
    SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
    for (int i = 0; i < rowSet.length; i++) { 
     Object o = rs.getObject(columunsNames[i]); 
     if (o instanceof Date) { 
      rowSet[i] = formatter.format((Date)o); 
     } else { 
      rowSet[i] = (String)o; 
     } 
    } 
} 

該方法將所有對象視爲Object,之後將檢查該Object是否是Date的實例。如果這是真的,則將根據formatter進行格式化。問題是,以這種方式返回的數據是這樣的:

2012-08-01 00:00:00.0

爲什麼?

更新1 - 最後的工作方法實現:

protected void populateDto(String[] rowSet, ResultSet rs, String[] columunsNames, SimpleDateFormat formatter) throws SQLException { 
    Timestamp ts = null; 
    for (int i = 0; i < rowSet.length; i++) { 
     Object obj = rs.getObject(columunsNames[i]); 
     if (obj instanceof Date) { 
      ts = rs.getTimestamp(columunsNames[i]); 
      rowSet[i] = formatter.format(ts); 
     } else { 
      if(obj!=null) 
       rowSet[i] = obj+""; 
      else 
       rowSet[i] = ""; 
     }  
    } 
} 

回答

2

該方法將所有對象視爲Object,之後將檢查該Object是否是Date的實例。

而不是date使用java.sql.Timestamp,有了這個你可以得到日期以及時間你要麼堅持數據或獲取數據。

更新1

你可以有一個像

public Timestamp getTimestamp(int columnIndex) throws SQLException { 
    Object value = getObject(columnIndex); 
    if (value instanceof Timestamp) return (Timestamp) value; 

    } 

這種一般的方法將返回的日期和時間,你可以通過傳遞列索引調用。

+0

如果我檢查instanceof Timestamp,我會得到一個錯誤,並將對象投射到Timestamp中。我該怎麼辦? –

+0

@Mariano你可以通過編輯你的問題發佈你的代碼嗎? – user75ponic

+0

你在哪裏建議使用Timestamp?你應該如何修改我的方法? –

4

java.sql.Date不存儲關於時間的信息:

爲了與SQL DATE的定義一致,毫秒值包裹由java.sql.Date實例必須通過在與實例關聯的特定時區中將小時,分鐘,秒和毫秒設置爲零來「標準化」。

相關問題