在 Java 中解析持续时间的最简洁方法

Cleanest way to parse duration in Java

scala.concurrent.duration 包提供了初始化持续时间的能力,如下所示:

Duration("5 minutes")

我无法在 Java 中找出可以让我轻松完成相同操作的等效项。任何建议(除了使用来自 Java 的 scala 之外?)

Java 本身不处理任何持续时间格式。您将需要像 Joda-Time or my lib Time4J 这样的第 3 方库才能执行您想要的操作。

Joda-Time(基于构建器):

PeriodFormatter pf = 
    new PeriodFormatterBuilder()
    .appendMinutes()
    .appendSuffix(" minute", " minutes")
    .toFormatter();
Period p = pf.parsePeriod("5 minutes");
System.out.println(p); // PT5M

Time4J(基于模式):

Duration<ClockUnit> d = 
  Duration.formatter(ClockUnit.class, "{m: :en:ONE=minute:OTHER=minutes}")
  .parse("5 minutes");
System.out.println(d); // PT5M

但是,此类解决方案通常存在以下限制。

  • 这样的过程通常只针对一种语言,因为文字是固定的。
  • 内部格式结构通常不灵活(输入可能包含意外单元)。

我的存储时长建议:

您最好使用 ISO-8601 格式进行存储,并使用用户定义的格式进行表示。这种方式是语言中立的,并且可以灵活地处理多个单元。示例:

使用 ISO 的 Joda-Time:

Period joda = ISOPeriodFormat.standard().parsePeriod("PT5M");
System.out.println(PeriodFormat.wordBased(Locale.ENGLISH).print(joda)); 
// 5 minutes

Time4J 使用 ISO:

Duration<ClockUnit> time4j = Duration.parseClockPeriod("PT5M");
System.out.println(PrettyTime.of(Locale.ENGLISH).print(time4j)); 
// 5 minutes