gpt4 book ai didi

java - 在Java中将日期转换为带时区的时间戳

转载 作者:行者123 更新时间:2023-12-05 02:46:46 27 4
gpt4 key购买 nike

我有一个 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
--------------------------------------------------

请注意,不支持 ZonedDateTimeInstantOffsetTime/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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com