【问题标题】:Convert from joda.Datetime to time.LocalDateTime is the right way?从 joda.Datetime 转换为 time.LocalDateTime 是正确的方法吗?
【发布时间】:2019-06-29 01:56:25
【问题描述】:

我需要数据库中日期的时间戳格式。 现在我在数据库中有 joda.Datetime,但在我的 restApi 应用程序中也有。

我尝试创建一个新列,并将现有的 joda.Datetime 转换为另一列 time.LocalDateTime。我还用 time.LocalDateTime 替换了所有代码 joda.DateTime。

它有效,但是当我在邮递员中拨打电话时,我收到了一个像这样的 json:

{
seconds: x1,
minutes: x2,
hours: x3,
days: x4,
........
}

我想我需要一个转换器,将时间戳显示为“dd-mm-yy hh-mm-ss”

我希望数据库中有时间戳格式,以便能够按时执行 SQL 标准操作和命名查询。

在我的数据库中,我有 bytea 类型的日期。我使用 PostgreSQL 和 DBeaver

这是正确的方法吗,或者您可以向我推荐其他选择?

【问题讨论】:

  • 您的数据库中没有“joda.Datetime”。 Joda 日期时间是 Java 表示。您使用哪种数据库,其中的日期格式如何?对于 JSON 部分,如果您使用 Jackson,则需要注册 JavaTimeModule,如下所示:github.com/FasterXML/jackson-modules-java8
  • 是的,你是对的,对不起。在我的数据库中,我有 bytea 类型的日期。我将 PostgreSQL 与 DBeaver 一起使用。但我的问题是:这种解决方案是改变我的时间类型的正确方法吗?

标签: java datetime time jodatime joda-convert


【解决方案1】:

这是正确的方法吗,或者您可以向我推荐其他选择?

如果没有使用 PostgreSQL 的经验,我应该说 bytea 是您的日期或时间戳的错误数据类型。 timestamp with time zone 不错,支持 SQL 操作和查询。它还有一个优点是您可以直接存储OffsetDateTime(甚至可能是Instant,我不确定),因此您可以避免格式化您的时间戳来存储它。会推荐的。

将时间戳作为时间戳日期和时间是不够的。日期和时间在不同时区会有不同的解释(在夏季时间结束并且时钟倒转的秋季甚至会变得模棱两可)。据我了解timestamp with time zone 将确保时间戳以UTC 格式存储,因此将是明确的时间点。在 Java 中,Instant 类表示独立于时区的时间点,因此适用于时间戳。一些 JDBC 驱动程序允许您将Instant 直接存储到timestamp with time zone 列中,而其他驱动程序则要求您先转换为OffsetDateTime。在后一种情况下使用

OffsetDateTime dateTimeForDatabase = yourInstant.atOffset(ZoneOffset.UTC);

编辑:请注意with time zone 位有点谎言,正如@Jon Skeet 在评论中指出的那样。数据库不存储时区或偏移量,它只确保日期和时间以 UTC 格式存储,以消除时间点的歧义。

链接: Date/Time Types in the PostgreSQL docs

【讨论】:

  • 据我所知,"timestamp with time zone" 并不真正对应于OffsetDateTime。 “有时区”有点谎言——它实际上只是改变了值的摄取方式。它只代表一个瞬间。
  • 感谢@JonSkeet 的评论。我的(有限的)理解同意你的。我读到存储OffsetDateTime 将确保存储正确的时间点,而不是偏移量。检索到OffsetDateTime 时得到的结果可能是OffsetDateTimein UTC(?)
  • 是的,我希望如此。或者它可能会将其转换为系统偏移量。但它不允许您存储和检索任意OffsetDateTime 值。基本上是Instant(虽然我不知道精度)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多