1

我有这个处理 ResultSet 的 Java 方法。

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;
        }   
    }
}

此方法将所有内容视为对象,之后将检查该对象是否是 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] = "";
        }       
    }
}
4

2 回答 2

4

java.sql.Date不存储有关时间的信息:

为了符合 SQL DATE 的定义,由 java.sql.Date 实例包装的毫秒值必须通过在实例关联的特定时区中将小时、分钟、秒和毫秒设置为零来“规范化” .

于 2012-11-20T12:15:09.767 回答
2

此方法将所有内容视为对象,之后将检查该对象是否是 Date 的实例。

而不是dateuse java.sql.Timestamp,有了它,您可以获取 Date 以及 Time ,您可以持久化数据或获取数据。

更新 1

你可以有一个通用的方法,比如

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

  }

这将返回日期和时间,您可以通过传递列索引来调用。

于 2012-11-20T12:21:48.927 回答