首页 > 解决方案 > 在Java中使用时区将日期转换为时间戳

问题描述

我有一个 PostgreSQL 数据库,其列定义为时间戳

例如,我正在接收时区格式为 yyyy-MM-ddTHH:mm:ss.SSSX" 的日期2020-12-16T15:05:26.507Z。如果我想将此插入带有时间戳的列中,它将抛出“时间戳格式必须为 yyyy-mm-dd hh:毫米:ss"

我在做

Timestamp.valueOf("2020-12-16T15:05:26.507")

现在时区日期来自 JSON,所以我现在将它作为字符串字符串。

如何将其转换为简单的时间戳格式?至 2020-12-16 15:05:26

标签: javatimestamplocaldate

解决方案


下表总结了日期时间类型的PostgreSQL列类型映射:Java SE 8

--------------------------------------------------
PostgreSQL                          Java SE 8
==================================================
DATE                                LocalDate
--------------------------------------------------
TIME [ WITHOUT TIMEZONE ]           LocalTime
--------------------------------------------------
TIMESTAMP [ WITHOUT TIMEZONE ]      LocalDateTime
--------------------------------------------------
TIMESTAMP WITH TIMEZONE             OffsetDateTime
--------------------------------------------------

请注意,不支持ZonedDateTime,InstantOffsetTime/ 。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 ],则可以获取LocalDateTimefromOffsetDateTime并使用相同的内容,如下所示:

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();

推荐阅读