【问题标题】:Parse ISO date by Period in Java 8在 Java 8 中按句点解析 ISO 日期
【发布时间】:2015-07-15 10:20:10
【问题描述】:

我想将JodaTime 替换为Java 8 DateTime API

我有 ISO-8601 期间描述 = P2W5DT11H8M

JodaTime 中,我通过执行以下代码非常简单地解析它:

Period.parse("P2W5DT11H8M") 我得到了成功的Period 对象。

我可以在 Java 8 中做同样的事情吗?

【问题讨论】:

  • 您对结果的意图是什么?您是否打算将句点添加到LocalDateTime?如果是这样,那么 Assylias 的答案隐含地建议的加法算法(两步单独加法)并不完全是 Joda-Time 定义的,并且在某些边缘情况下可能会产生不同的结果。此外,Java-8 中没有针对句点/持续时间的格式化功能,因此您可能会重新考虑您的决定。
  • @MenoHochschild 我希望拥有与 JodaTime 相同的期间。目前,我看到我正在丢失数据,例如我无法操作分钟,而不是它,我应该使用 Java 8 的额外实现 - Duration 类。

标签: java datetime java-8 jodatime java-time


【解决方案1】:

Java 8 中的 Period 仅包含年/月/日组件。 Duration 具有小时/分钟/秒组件。看来您需要手动解析字符串。一个选项可能类似于下面的代码(您需要添加输入验证等) - 可能有更好的选择。

public static void main(String[] args) {
  System.out.println(PeriodAndDuration.parse("P2W5DT11H8M"));
}

public static class PeriodAndDuration {
  private final Period p;
  private final Duration d;

  public PeriodAndDuration(Period p, Duration d) {
    this.p = p;
    this.d = d;
  }

  public Period getPeriod() {
    return p;
  }

  public Duration getDuration() {
    return d;
  }

  public static PeriodAndDuration parse(String input) {
    int periodStart = input.indexOf("P");
    int timeStart = input.indexOf("T");
    Period p = Period.parse(input.substring(periodStart, timeStart));
    Duration d = Duration.parse("P" + input.substring(timeStart, input.length()));
    return new PeriodAndDuration(p, d);
  }

  @Override
  public String toString() {
    return p.toString() + d.toString();
  }
}

【讨论】:

  • 感谢您的回答。所以,据我所知,解析这样的完整字符串我应该负责并认为我只能从中解析年/月/日。
  • 据我所知是的 - 其他人可能会想出更好的答案。
  • 这种组合已经写在org.threeten.extra.PeriodDuration中了。详情请见my Answer
【解决方案2】:

PeriodDuration

Period.parse("P2W5DT11H8M")

我可以在 Java 8 中做同样的事情吗?

是的。

org.threeten.extra.PeriodDuration.parse( "P2W5DT11H8M" )

ThreeTen-Extra 项目

Java 8 及更高版本中内置的 java.time 类由ThreeTen-Extra 项目补充。该项目由运行 Joda-Time 和 JSR 310(java.time 的规范)的同一个人运行,Stephen Colebourne

该项目提供了 PeriodDuration,它结合了 java.time 中的 PeriodDuration 类的想法。

PeriodDuration.parse 的文档说:

从 PnYnMnDTnHnMnS 等文本字符串中获取实例。

PeriodDuration pd = PeriodDuration.parse( "P2W5DT11H8M" ) ;

警告

在使用PeriodDuration 之前请三思。

年-月-日和时-分-秒这两个概念在java.time中被分开是有原因的。仔细想想,你可能会发现在实践中将两者结合起来可能没有意义。

如果您继续学习该课程,请务必研究文档及其行为。练习一些场景,看看它是否符合您的期望和需求。


关于java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.DateCalendarSimpleDateFormat

Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310

您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。

从哪里获得 java.time 类?

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

【讨论】:

    【解决方案3】:

    简答:

    Period period = Period.parse("P2W5DT11H8M");
    

    长答案:Oracle 在when to use Period or Duration 上有一个很好的描述。它附带了一些不错的代码示例,应该可以回答您可能遇到的任何后续问题。

    【讨论】:

    • 那会在运行时抛出异常。
    猜你喜欢
    • 2013-05-14
    • 2011-06-17
    • 2016-04-21
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    • 2015-12-26
    • 2015-12-25
    • 2017-09-26
    相关资源
    最近更新 更多