【问题标题】:Java Time API get offset from sql Timestamp given the Chronology给定 Chronology,Java Time API 从 sql Timestamp 获取偏移量
【发布时间】:2020-06-27 10:24:47
【问题描述】:

我有以下代码,它使用 Joda 时间库从 sql Timestamp 对象中获取偏移量。

public static long getOffset(Chronology chronology_, Timestamp timeStamp_)
  {
    long offset = 0;
    if (chronology_ != null)
      {
        offset = chronology_.getZone().getOffset(new DateTime(timeStamp_).getMillis());
      }
    return offset;
  }

如何使用 Java 8 API 实现相同的功能。我不确定是否还需要年表。

【问题讨论】:

  • 我认为在调用此方法之前可以解决问题,换句话说,您不需要从数据库中获取Timestamp。如果你告诉我们如何获得timeStamp_也许我们可以提出一个合适的解决方案
  • 这是一个实用程序代码,我有一个 sql 时间戳。我不控制我们如何获得时间戳
  • A java.sql.Timestamp 旨在无时区,除非它不是由于历史上糟糕的设计决策。您应该切换到使用java.time.LocalDateTime(或使用数据库中的时区类型到java.time.OffsetDateTime)。

标签: java jdbc java-8 jodatime


【解决方案1】:

虽然年表的 Joda-Time 概念和年表的 java.time (JSR-310) 概念相似,但在您的情况下存在重要差异:Joda-Time Chronology 可能(可选)有一个时区。 java.time.chrono.Chronology 不能。因此,您需要以其他方式提供用于操作的时区,而不是通过年表。

现在我们已经完成了,我可能会建议您以其他方式提供时间点,而不是通过 java.sql.Timestamp。所以一种选择是:

public static long getOffset(ZoneId zone, Instant when)
{
    long offset = 0;
    if (zone != null)
    {
        int offsetSeconds = zone.getRules()
                .getOffset(when)
                .getTotalSeconds();
        offset = TimeUnit.SECONDS.toMillis(offsetSeconds);
    }
    return offset;
}

如果您的调用者从旧版 API 中获得了老式的 Timestamp 且无法更改,则应进行转换。所以调用上述方法的一种方法是:

    long offsetMillis = getOffset(
            ZoneId.of("Africa/Khartoum"), theirTimesatmp.toInstant());
    System.out.println(offsetMillis);

现在使用时间戳的示例输出:

7200000

Timestamp 类设计不佳,是对已经设计不佳的java.util.Date 类的真正破解,因此我们不应该使用它。如果我们无法避免得到一个,我们应该立即将其转换为 InstantLocalDateTime 并从那里执行或进一步工作。

如果您的方法返回从 getOffset() 返回的 ZoneOffset 对象,而不是可能让调用者想知道它是秒、毫秒还是其他单位的数字,则进一步的改进将是。

如果您确实坚持提供接受Timestamp 的便捷方法,您当然可以添加对过去友好的包装器。例如:

/** @deprecated use {@link #getOffset(ZoneId, Instant)} instead */
public static long getOffset(ZoneId zone, Timestamp timeStampParam)
{
    return getOffset(zone, timeStampParam.toInstant());
}

链接: Converting from Joda-Time to java.time Stephen Colebourne 的博客

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-01-14
    • 2014-07-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多