java中的“漂亮打印”持续时间

有没有人知道一个Java库,可以漂亮的打印一个数字以毫秒为单位,就像c#一样?

例如123456毫秒,会打印为4d1h3m5s

(可能不准确,但你希望看到我得到什么!!)

-高手

乔达时间有一个很好的方式来使用PeriodFormatterBuilder来做到这一点 。

Quick Win: PeriodFormat.getDefault().print(duration.toPeriod());

例如

 //import org.joda.time.format.PeriodFormatter; //import org.joda.time.format.PeriodFormatterBuilder; //import org.joda.time.Duration; Duration duration = new Duration(123456); // in milliseconds PeriodFormatter formatter = new PeriodFormatterBuilder() .appendDays() .appendSuffix("d") .appendHours() .appendSuffix("h") .appendMinutes() .appendSuffix("m") .appendSeconds() .appendSuffix("s") .toFormatter(); String formatted = formatter.print(duration.toPeriod()); System.out.println(formatted); 

我已经使用Java 8的Duration.toString()和一些正则expression式构build了一个简单的解决scheme:

 public static String humanReadableFormat(Duration duration) { return duration.toString() .substring(2) .replaceAll("(\\d[HMS])(?!$)", "$1 ") .toLowerCase(); } 

结果将如下所示:

 - 5h - 7h 15m - 6h 50m 15s - 2h 5s - 0.1s 

如果你不想要空格,只要删除replaceAll

JodaTime有一个Period类,可以表示这样的数量,并且可以通过ISO8601格式呈现(通过IsoPeriodFormat ),例如PT4D1H3M5S ,例如

 Period period = new Period(millis); String formatted = ISOPeriodFormat.standard().print(period); 

如果这种格式不是你想要的格式,那么PeriodFormatterBuilder可以让你组装任意的布局,包括C#风格的4d1h3m5s

使用Java 8,您还可以使用java.time.DurationtoString()方法java.time.Duration进行格式化,而无需使用基于ISO 8601秒的表示forms (如PT8H6M12.345S)的外部库。

Apache commons-lang提供了一个有用的类来完成DurationFormatUtils

例如DurationFormatUtils.formatDurationHMS( 15362 * 1000 ) ) => 4:16:02.000(H:m:s.millis) DurationFormatUtils.formatDurationISO( 15362 * 1000 ) ) => P0Y0M0DT4H16M2.000S, ISO8601

以下是使用纯JDK代码的方法:

 import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.Duration; long diffTime = 215081000L; Duration duration = DatatypeFactory.newInstance().newDuration(diffTime); System.out.printf("%02d:%02d:%02d", duration.getDays() * 24 + duration.getHours(), duration.getMinutes(), duration.getSeconds()); 

我意识到这可能不适合你的用例,但PrettyTime可能在这里很有用。

 PrettyTime p = new PrettyTime(); System.out.println(p.format(new Date())); //prints: “right now” System.out.println(p.format(new Date(1000*60*10))); //prints: “10 minutes from now” 

Joda-Time的构build方法的替代scheme将是基于模式的解决scheme 。 这是我的图书馆Time4J提供的。 使用类Duration.Formatter的示例(添加一些空格以提高可读性 – 删除空格将生成希望的C#风格):

 IsoUnit unit = ClockUnit.MILLIS; Duration<IsoUnit> dur = Duration.of(123456, unit).with(Duration.STD_PERIOD); String s = Duration.Formatter.ofPattern("D'd' h'h' m'm' s.fff's'").format(dur); System.out.println(s); // output: 0d 0h 2m 3.456s 

另一种方法是使用类net.time4j.PrettyTime (这也适用于本地化输出和打印相对时间):

 s = PrettyTime.of(Locale.ENGLISH).print(dur, TextWidth.NARROW); System.out.println(s); // output: 2m 3s 456ms