首页 > 解决方案 > 从 joda.Datetime 转换为 time.LocalDateTime 是正确的方法吗?

问题描述

我需要数据库中日期的时间戳格式。现在我在数据库中有 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一起使用。

这是正确的方法,还是您可以向我推荐另一种选择?

标签: javadatetimetimejodatimejoda-convert

解决方案


这是正确的方法,还是您可以向我推荐另一种选择?

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

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

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

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

链接: PostgreSQL 文档中的日期/时间类型


推荐阅读