2

我觉得这个问题已经被以某种方式提出,但我仍然对我的结果没有信心。

我有一个 xsd:duration,它将给我一个以年、月、日和秒为单位的期望到期时间。duration.getYears()例如,我可以使用或收集这些部分的整数值duration.getMonths()

因为我选择的数据库是 Cassandra,所以我想利用 TTL 选项,它会在指定的秒数后自动使插入的行过期。

关键部分是从 xsd:duration 获取符合公历的整数/长秒值(从现在开始的 1 个月不仅仅是 30.41 天,而是 31 天)。

目前,我正在使用以下代码:

LocalDateTime then = LocalDateTime.now().plusYears(duration.getYears()).plusMonths(duration.getMonths()).plusDays(duration.getDays()).plusHours(duration.getHours()).plusMinutes(duration.getMinutes()).plusSeconds(duration.getSeconds());
long ttlMillis = then.toInstant(ZoneOffset.UTC).toEpochMilli() - Instant.now().toEpochMilli();

有没有更快/更清洁的方法来做到这一点?

我也不确定我是否应该担心较长的持续时间......我的特定用例不需要超过 2 年的时间。

4

1 回答 1

3

给所有人的信息说明:

你说的是javax.xml.datatype.Duration,不是java.time.Duration

你的问题:

a)有没有更快的方法来做到这一点(使用 Java-8)?几乎不。负责 Java-8 中新日期和时间库的 JSR-310 团队的设计者并不太关心与 JDK 中现有 XML 类的桥梁。因此,没有直接的方法可以将 xml-duration 转换为任何类型的 JSR-310-duration。

还要记住,JSR-310 类Period(状态由年、月和日组成)和Duration(状态由秒和纳秒组成)并不是真正设计用于表示 xml 持续时间(如在你的代码)。所以我怀疑我们将来是否会在 JSR-310 和 XML 之间看到一个定义明确的桥梁(可能仅以毫秒为基础?)。JSR-310 和 XML 中的符号处理也完全不同。因此,如果您在 xml-duration 中有负号,请务必小心。

b)有没有更简洁的方法来做到这一点(使用 Java-8)?是有点。需要考虑的一件事是:我只会将时钟用作实际时刻的时间源一次,而不是两次。这个(非常)小的改进的例子:

Instant now = Instant.now();
LocalDateTime start = now.atOffset(ZoneOffset.UTC).toLocalDateTime();
LocalDateTime end = 
  start.plusYears(duration.getYears())
  .plusMonths(duration.getMonths())
  .plusDays(duration.getDays())
  .plusHours(duration.getHours())
  .plusMinutes(duration.getMinutes())
  .plusSeconds(duration.getSeconds());
long deltaInMillis = end.toInstant(ZoneOffset.UTC).toEpochMilli() - now.toEpochMilli();

要考虑的第二件事: xml-duration 类是为与java.util.Date. 所以你也有这个简短的选择:

Date start = new Date();
long deltaInMillis = duration.getTimeInMillis(start);

这种替代方案不仅更短,而且可能更精确,因为它考虑了毫秒部分。根据文档,如果您的持续时间项目在长范围内(超出 int 范围),您应该只担心正确性。另一个主题是与任何隐藏时区计算的关系。我没有在文档中看到任何提示,所以这可能是唯一让您担心的项目(本地时区?或 UTC?-未测试)。

c)为什么要担心大的持续时间?即使您的持续时间大于假设几个世纪可能超过历史公历的有效性限制,您也应该记住 xml-duration 仅使用预测公历,而不是历史公历。并且也LocalDateTime使用相同的公历。然而,如果如此大的持续时间与任何真实数据相关,则是另一个好问题。

于 2014-09-25T14:32:32.210 回答