MySQL データベースには、「2012-01-18 09:45:30」という形式の datetime 列を含むテーブルがあります。次の構文を使用して、このテーブルの内容をクエリします。
Statement s = conn.createStatement();
s.executeQuery( "select * from db_name.tbl_name;");
ResultSet rs = s.getResultSet();
ResultSetMetaData = rs.getMetaData();
int numberOfColumns = metaData.getColumnCount();
//Put Column Header info in Vector
Vector columnNames = new Vector();
for (int column = 0; column < numberOfColumns; column++) {
columnNames.addElement(metaData.getColumnLabel(column+1));
}
//Put sql table data in Vector of Vectors
Vector data = new Vector();
while (rs.next()) {
Vector newRow = new Vector();
newRow.addElement(rs.getObject(i));
}
s.close();
rs.close();
DefaultTableModel model = new DefaultTableModel(data,columnNames);
JTable table = new JTable(model);
JScrollPane pane = new JScrollPane(table);
DefaultTableModel で getColumnClass をオーバーライドしないと、MySQL の datetime 列が JTable に次の形式の文字列として表示されます。
2012-01-18 09:45:30
次の構文を使用して日時列のクラス名を取得すると、返されるクラスは java.sql.Timestamp です。
System.out.println(metaData.getColumnClassName(i));
さて、これは私を混乱させる部分です。次の構文を使用して、DefaultTableModel の getColumnClass メソッドをオーバーライドして正しいクラスを返すと、datetime 列は次のようにフォーマットされて表示されます。
Jan 18,2012
時間部分が完全に省略されていることに注意してください。
@override
public Class getColumnClass(int column) {
for (int row = 0; row < getRowCount(); row++) {
Object o = getValueAt(row, column);
if (o != null) {
try {
switch (metaData.getColumnClassName(column+1)) {
case "java.sql.Timestamp":
return java.sql.Timestamp.class;
case "java.sql.Date":
return java.sql.Date.class;
}
}
catch (SQLException ex) {
Logger.getLogger(ResultSetToCheckBoxTable.class.getName()).log(Level.SEVERE, null, ex);
}
}
return Object.class;
}
また、java.sql.Date 列を表示しようとすると、次の形式の文字列として表示されます。
2012-01-18
GetColumnClass をオーバーライドして正しいクラスを返すかどうかに関係なく。
次のように表示する方法java.sql.Date
:日付と時刻を表示するにはJan 18, 2012
?java.sql.TimeStamp