java - 在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
解决方案
下表总结了日期时间类型的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 ]
,则可以获取LocalDateTime
fromOffsetDateTime
并使用相同的内容,如下所示:
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();
推荐阅读
- swift - Alamofire.upload SwiftLint 违规
- node.js - 如何使用 JWT 令牌显示当前登录用户的用户名
- python - 如何使用 Youtube API v3 按类别过滤视频?
- css - IE11 和 CSS 网格
- javascript - 迭代器 getter 不可调用
- javascript - 根据选中的复选框调整 jquery 过滤脚本以在页面重新加载时运行
- php - 5分钟前获取插入数据库的消息的功能
- c++11 - 剥离 .gnu.version 部分时的段错误
- angular - Angular HttpClient 获取方法订阅无法读取未定义的属性“长度”
- swift - 在字典中使用数组