Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I "pretty print" a Duration in Java?

Does anyone know of a Java library that can pretty print a number in milliseconds in the same way that C# does?

E.g., 123456 ms as a long would be printed as 4d1h3m5s.

like image 880
phatmanace Avatar asked Aug 12 '10 19:08

phatmanace


People also ask

How do I print a specific date in Java?

Formatting Dates String pattern = "yyyy-MM-dd"; SimpleDateFormat simpleDateFormat = new SimpleDateFormat(pattern); String date = simpleDateFormat. format(new Date()); System. out. println(date);

How do you create an object's duration?

We can create a Duration object by using one of the Duration class factory methods: static Duration of(long amount, TemporalUnit unit): Obtains a Duration representing an amount in the specified unit. static Duration ofDays(long days): Obtains a Duration representing a number of standard 24 hour days.


Video Answer


2 Answers

I've built a simple solution, using Java 8's Duration.toString() and a bit of regex:

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

The result will look like:

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

If you don't want spaces between, just remove replaceAll.

like image 199
lucasls Avatar answered Sep 22 '22 06:09

lucasls


Joda Time has a pretty good way to do this using a PeriodFormatterBuilder.

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

e.g.

//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); 
like image 42
Rob Hruska Avatar answered Sep 23 '22 06:09

Rob Hruska