gpt4 book ai didi

java - 如何将 java.sql.Timestamp 转换为 java.time.OffsetDateTime?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:33:10 25 4
gpt4 key购买 nike

我正在处理一个 Scala 项目,我需要将 OffsetDateTime 类型映射到 SQL Timestamp 类型。在数据库中,我想要 UTC 时间。

OffsetDateTimeTimestamp 的转换很简单(来自 this question 的提示)并且按预期工作:

import java.time._
import java.sql.Timestamp
val ofsdatetime = OffsetDateTime.now()
// ofsdatetime: java.time.OffsetDateTime = 2017-04-04T21:46:33.567+02:00

val tstamp = Timestamp.valueOf(ofsdatetime.atZoneSameInstant(ZoneOffset.UTC).toLocalDateTime())
// tstamp: java.sql.Timestamp = 2017-04-04 19:46:33.567

如您所见,时区已被删除,时间戳向后两个小时 (UTC),太棒了!

Timestamp 转换回 OffsetDateTime 未按预期工作:

OffsetDateTime.ofInstant(Instant.ofEpochMilli(tstamp.getTime), ZoneId.systemDefault())

// java.time.OffsetDateTime = 2017-04-04T19:46:33.567+02:00

新创建的OffsetDateTime添加了时区,但是时间不正确(还是UTC,需要适配实际时区)。

为什么?我做错了什么?

最佳答案

尽管 java.sql.Timestamp 存储纪元毫秒,.toString 方法使用默认时区来呈现字符串。此外,.valueOf 使用您的默认时区解释 LocalDateTime

两者结合,导致第一个转换“看起来”正确,但实际上是错误的。值“2017-04-04 19:46:33.567”显示在您的默认 TZ 中,而不是 UTC。

因为您向 valueOf 方法传递了一个 LocalDateTime (UTC),但它会将其解释为 LocalDateTime(您的默认 TZ)。

这里证明第一次转换是错误的:

scala> val now = OffsetDateTime.now
now: java.time.OffsetDateTime = 2017-04-04T14:50:12.534-06:00

scala> Timestamp.valueOf(now.atZoneSameInstant(ZoneId.of("UTC")).toLocalDateTime).getTime == now.toInstant.toEpochMilli
res54: Boolean = false

现在删除了 .atZoneSameInstant:

scala> Timestamp.valueOf(now.toLocalDateTime).getTime == now.toInstant.toEpochMilli
res53: Boolean = true

所引用的 stackoverflow 问题的公认答案是错误的。

一旦您修复了第一个转换(删除 .atZoneSameInstant),那么您的第二个转换应该可以正常工作。

关于java - 如何将 java.sql.Timestamp 转换为 java.time.OffsetDateTime?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43216737/

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