gpt4 book ai didi

java - 将字符串转换为 Postgres 时间戳并返回

转载 作者:行者123 更新时间:2023-11-29 14:09:13 25 4
gpt4 key购买 nike

第 1 部分:

我有一个包含以下格式的日期字符串的文件:2006-02-16T21:36:32.000+0000

我需要将此值写入 Postgres 的一个类型为 Timestamp 的列中。我如何在 Java 中执行此操作?

第 2 部分:

我需要从 Postgres 中读取第 1 部分中保存的值,并将其转换为以下格式的字符串 "2006-02-16T21:36:32.000+0000"


这是我试过的:

时间戳 lastSyncDate = Timestamp.valueOf(2006-02-16T21:36:32.000+0000)

当我尝试将其写入 postgres 时,出现以下错误:

java.lang.IllegalArgumentException: 时间戳格式必须是 yyyy-mm-dd hh:mm:ss[.fffffffff]

最佳答案

tl;dr

myPreparedStatement.setObject( 
… ,
OffsetDateTime.parse( "2006-02-16T21:36:32.000+0000" )
)

带和不带区域/偏移

您说您的列是 TIMESTAMP 类型,它是 TIMESTAMP WITHOUT TIME ZONE 的缩写。这种类型故意缺少任何时区或与 UTC 的偏移量的概念。 通常适合常见的商业目的。

您使用了错误的类型

那是您输入的错误类型。您的输入与 UTC 的偏移量为零小时,这意味着 UTC 本身。有了偏移量或区域,您的数据应该只存储在 TIMESTAMP WITH TIME ZONE 类型的列中。在这个 ...WITH... 类型的 Postgres 中,任何提交的偏移量/区域信息都用于调整为 UTC 进行存储,然后丢弃。

TIMESTAMP WITHOUT TIME ZONE 类型的列中存储带有偏移量或时区的日期时间值就像存储具有指定货币(美元、欧元、卢布等)的价格/成本。 ) 在数字类型的列中。您正在丢失重要数据,即货币。这会使您的数据变得毫无值(value)。

参见 Postgres documentation page对于这些类型。

智能对象,而不是哑字符串

尽可能使用对象与数据库交换数据,而不是传递仪表字符串。让你的JDBC drivermarshaling the data做它的工作来回。

将输入字符串解析为 OffsetDateTime目的。

ISO 8601

您的输入字符串采用 ISO 8601 定义的格式标准。 java.time 类在解析/生成字符串时默认使用 ISO 8601 格式。无需指定格式化模式。

String input = "2006-02-16T21:36:32.000+0000" ;
OffsetDateTime odt = OffsetDateTime.parse( input ) ;

将您的 SQL 定义为准备好的语句。

使用 JDBC 4.2 及更高版本,您可以直接与数据库交换 java.time 对象。无需再次使用麻烦的遗留类,例如 java.sql.Timestamp

您可以传递一个 OffsetDateTime。我喜欢提取一个 Instant 来向读者展示我了解 Postgres 如何始终以 UTC 格式存储 TIMESTAMP WITH TIME ZONE 值。

Instant instant = odt.toInstant() ;
myPreparedStatement.setObject( … , instant ) ;

检索。

Instant instant = myResultSet.getObject( … , Instant.class ) ;

关于java - 将字符串转换为 Postgres 时间戳并返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50164630/

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