如何将对象的 sql 时间转换为 java 时间?

How can I convert sql time to java time for an object?

当我运行这段代码时,它是这样说的:

Error:(43, 31) java: incompatible types: java.sql.Time cannot be converted to java.time.LocalTime

public TrackTime read(int id){

        rs = jdbc.queryForRowSet("SELECT * FROM tracktime where id ='" + id + "'");
        while (rs.next()){
            return new TrackTime (rs.getInt("id"),
                    rs.getDate("date"),
                    rs.getTime("startTime"),
                    rs.getTime("endTime"),
                    rs.getString("licenseType"),
                    rs.getInt("trackNumber"));
        }

        return new TrackTime();
    }

导致此错误的原因是什么?

TrackTime class 的构造函数必须期待 class LocalTime 的对象,其中 rs.getTime("startTime") returns java.sql.Time而不是 LocalTime,因为两者不一样,所以你会得到错误。

您可以在 Time 对象上使用 toLocalTime() 方法,其中 returns LocalTime 对象这样正确的对象类型将传递给您的构造函数并且应该远离错误。

所以在你的代码中你需要这样做,

while (rs.next()){
    return new TrackTime (rs.getInt("id"),
            rs.getDate("date"),
            rs.getTime("startTime").toLocalTime(),
            rs.getTime("endTime").toLocalTime(),
            rs.getString("licenseType"),
            rs.getInt("trackNumber"));
}

正如其他人已经说过的,这一定是因为您 TrackTime 构造函数需要 LocalTime 类型的参数,而 rs.getTime returns java.sql.Time.

假设 JDBC 4.2(或更高;你可能有),使用 getObject 检索 java.time 类 就像 LocalTimeLocalDate 来自您的结果集:

    return new TrackTime (rs.getInt("id"),
            rs.getObject("date", LocalDate.class),
            rs.getObject("startTime", LocalTime.class),
            rs.getObject("endTime", LocalTime.class),
            rs.getString("licenseType"),
            rs.getInt("trackNumber"));

我也随意更改了日期的检索,这可能会给您带来新的编译时错误。但是既然你已经在使用 java.time,最好将 TrackTime 构造函数更改为接受 LocalDate?

如果您的 JDBC 驱动程序尚未 JDBC 4.2 兼容,请考虑升级。