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

Duration("5 minutes")


我想不出Java中的等效方法,可以让我轻松地完成相同的工作。有什么建议(除了使用Java的scala之外?)

最佳答案

Java本身不处理任何持续时间格式。您将需要诸如Joda-Time或我的lib Time4J之类的3rd-party-library来完成您想要的事情。

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

07-28 14:12
查看更多