我有一个列类型为TIMESTAMP with TIME ZONE的表。我想读取行SELECT * FROM " test_timestamp_wtz_2 "Where time_with_zone = ?;
String d = "2021-10-18 16:11:10.0 Europe/Paris";
DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss.n VV");
ZonedDateTime tm = ZonedDateTime.parse(d, dtf2);
// OffsetDateTime odt =OffsetDateTime.parse(d,dtf2);
// String z = tm.getZone().getId();
// System.out.println(tm.getZone());
// ThIS IS THE MAIN CODE
// SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.S");
// Calendar c = Calendar.getInstance();
// c.setTime(dateFormat.parse(d));
// c.setTimeZone(TimeZone.getTimeZone(z));
// Date date = dateFormat.parse(d);
// String parsed = dateFormat.format(date);
// Timestamp timestamp = new Timestamp(c.getTimeInMillis());
// Datum dtm = new TIMESTAMPTZ(con, new java.sql.Timestamp(c.getTimeInMillis()), c);
// Datum dtm = new TIMESTAMPTZ(con, new java.sql.Timestamp(c.getTimeInMillis()), tm.getZone());
// PreparedStatement ps = con.prepareStatement(query);
// ps.setObject(1,dtm);
// ResultSet rs = ps.executeQuery();
// Calendar c = Calendar.getInstance();
// while ((rs.next())) {
// System.out.println(rs.getObject(2));
// }
日期存在于DB中,但我无法基于where子句获得。
谁能帮我纠正我做错了什么?
我建议您不要将现代Date-Time API与遗留API混合使用。java.util
日期-时间API及其格式化APISimpleDateFormat
过时且容易出错。建议完全停止使用它们,切换到现代的Date-Time API*。
使用java.time
,现代日期时间API,下面给出的是如何从类型为TIMESTAMP WITH TIMEZONE
的字段中提取数据:
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT * FROM mytable WHERE <some condition>");
while (rs.next()) {
// Assuming the column index of columnfoo is 1
OffsetDateTime odt = rs.getObject(1, OffsetDateTime.class));
System.out.println(odt);
}
rs.close();
st.close();
其中columnfoo
的类型为TIMESTAMP WITH TIMEZONE
.
*如果你正在为一个Android项目工作,你的Android API级别仍然不兼容Java-8,检查Java 8+可用的API。注意Android 8.0 Oreo已经提供了对java.time
的支持。