我有一个 PostgreSQL 数据库,其中有一列定义为时间戳
我收到时区格式为 yyyy-MM-ddTHH:mm:ss.SSSX 的日期,例如 2020-12-16T15:05:26.507Z
。如果我想插入这个到带有时间戳的列中,它将抛出 "Timestamp format must be yyyy-mm-dd hh:mm:ss"
我在做
Timestamp.valueOf("2020-12-16T15:05:26.507")
现在时区日期来自 JSON,所以我现在将其作为字符串。
如何将其转换为简单的时间戳格式?至 2020-12-16 15:05:26
最佳答案
下表总结了 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();
关于java - 在Java中将日期转换为带时区的时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65352082/