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

标签 java timestamp localdate

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

相关文章:

java - 实例化: <jsp:useBean> vs.新关键字

php - 从确切日期到确切日期选择记录

java - JPA CreateNativeQuery 返回错误的日期

javascript - 为什么 JS 假设没有时间的字符串日期是 UTC,如果填充 0,如果不填充,则为本地?

java - 日期时间解析异常;无法在索引 4 处解析文本 '2018-10-18 00:00:00'

java - JavaFX ControlsFX 对话框中的 Action 按钮 css 样式

java - Spring:在属性文件中定义@RequestMapping值

java - 每次运行代码时字段的其他位置

vba - 时间戳显示文件上次按 F9 更新的时间(仅编辑是不够的)

php - 如何使用 CURRENT_TIMESTAMP 在 mysql 中将 Gregorian 格式转换为 Solar 格式