我不知道我在这里做错了什么。
你没有做错任何事。您之前遇到过 Microsoft SQL Server 的 JDBC 驱动程序的缺陷版本7.1.0, 讨论了here.
如果您使用的是 mssql-jdbc 版本 7.1.0 或更高版本,那么您可以使用getObject(x, LocalDateTime.class)
正如预期的那样。
对于 7.1.0 之前的 mssql-jdbc 版本,正如其他人所建议的那样,您需要检索Timestamp
并将其转换为LocalDateTime
。但是,请注意,简单的解决方案......
LocalDateTime dateTime = resultSet.getTimestamp("date_from").toLocalDateTime()
...如果 JVM 的默认时区遵守夏令时(又称“夏令时”),则会损坏某些日期/时间值。例如,
// time zone with Daylight Time
TimeZone.setDefault(TimeZone.getTimeZone("America/Edmonton"));
// test environment
Statement st = conn.createStatement();
st.execute("CREATE TABLE #tmp (id INT PRIMARY KEY, dt2 DATETIME2)");
st.execute("INSERT INTO #tmp (id, dt2) VALUES (1, '2018-03-11 02:00:00')");
ResultSet rs = st.executeQuery("SELECT dt2 FROM #tmp WHERE id=1");
rs.next();
// test code
LocalDateTime x = rs.getTimestamp("dt2").toLocalDateTime(); // bad
System.out.println(x.toString());
将打印“2018-03-11T03:00”。请注意,时间是“03:00”,而不是“02:00”。
相反,您需要检索Timestamp
作为 UTC,然后将其转换为LocalDateTime
对于 UTC,从而删除时区部分
// time zone with Daylight Time
TimeZone.setDefault(TimeZone.getTimeZone("America/Edmonton"));
// test environment
Statement st = conn.createStatement();
st.execute("CREATE TABLE #tmp (id INT PRIMARY KEY, dt2 DATETIME2)");
st.execute("INSERT INTO #tmp (id, dt2) VALUES (1, '2018-03-11 02:00:00')");
ResultSet rs = st.executeQuery("SELECT dt2 FROM #tmp WHERE id=1");
rs.next();
// test code
Timestamp ts = getTimestamp("dt2", Calendar.getInstance(TimeZone.getTimeZone("UTC")));
LocalDateTime x = LocalDateTime.ofInstant(ts.toInstant(), ZoneId.of("UTC")); // good
System.out.println(x.toString());
打印“2018-03-11T02:00”。