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

标签 java jodatime

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

Duration("5 minutes")

我无法在 Java 中找到一个等价的方法来让我轻松地完成同样的事情。有什么建议(除了使用 Java 中的 scala 之外?)

最佳答案

Java 本身不处理任何持续时间格式。您将需要像Joda-Time这样的第三方库或我的库 Time4J为了做你想做的事。

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

使用 ISO 的 Time4J:

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

关于java - 在 Java 中解析持续时间的最简洁方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33817496/

相关文章:

java - Apache CXF 插件 - 故障生成客户端

java - 使用 equals/hashCode 比较延迟加载的 Spring Data MongoDB 实体

timezone - 为什么这个 Joda 偏移量无法正确获得夏令时

java - jodatime 在解析某些日期格式时的奇怪行为

java - 如何使用 Java 中的 Joda 时间库获取 ISO 年的月份开始和结束日期

Java 构造函数或新类

java - 如何从链表中删除素数

java - 我可以通过 Java 中的父类(super class)引用访问子类对象的属性吗?

jodatime - 使用 JodaTime 获取下周一

scala - 反序列化后 DateTime 不等于自身