下表总结了PostgreSQL 列类型与Java SE 8 日期时间类型的映射:
--------------------------------------------------
PostgreSQL Java SE 8
==================================================
DATE LocalDate
--------------------------------------------------
TIME [ WITHOUT TIMEZONE ] LocalTime
--------------------------------------------------
TIMESTAMP [ WITHOUT TIMEZONE ] LocalDateTime
--------------------------------------------------
TIMESTAMP WITH TIMEZONE OffsetDateTime
--------------------------------------------------
请注意,不支持 ZonedDateTime、Instant 和 OffsetTime / TIME [ WITHOUT TIMEZONE ]。另外请注意,所有OffsetDateTime 实例都必须位于UTC(其时区偏移量为+00:00 小时)。这是因为后端将它们存储为UTC。
因此,有两种选择。
选项 - 1(推荐):
将列类型更改为TIMESTAMP WITH TIMEZONE。这是推荐的,因为您的日期时间字符串有Z,它代表Zulu 日期时间或UTC 日期时间。使用OffsetDateTime,您可以解析此日期时间字符串,而无需明确要求任何DateTimeFormatter。
演示:
import java.time.OffsetDateTime;
public class Main {
public static void main(String[] args) {
OffsetDateTime odt = OffsetDateTime.parse("2020-12-16T15:05:26.507Z");
System.out.println(odt);
}
}
输出:
2020-12-16T15:05:26.507Z
下面是一个示例,说明如何将此 OffsetDateTime 用于 DB CRUD 操作:
OffsetDateTime odt = OffsetDateTime.parse("2020-12-16T15:05:26.507Z");
PreparedStatement st = conn.prepareStatement("INSERT INTO mytable (columnfoo) VALUES (?)");
st.setObject(1, odt);
st.executeUpdate();
st.close();
选项 - 2:
如果您仍想保持列类型为TIMESTAMP [ WITHOUT TIMEZONE ],您可以从OffsetDateTime 获取LocalDateTime 并使用如下所示:
OffsetDateTime odt = OffsetDateTime.parse("2020-12-16T15:05:26.507Z");
LocalDateTime ldt = odt.toLocalDateTime();
PreparedStatement st = conn.prepareStatement("INSERT INTO mytable (columnfoo) VALUES (?)");
st.setObject(1, ldt);
st.executeUpdate();
st.close();