Explain Codes LogoExplain Codes Logo

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

java
prompt-engineering
best-practices
performance
Anton ShumikhinbyAnton Shumikhin·Feb 10, 2025
TLDR

To 'pretty print' a Duration object in Java 9+, apply these four methods: toDaysPart(), toHoursPart(), toMinutesPart(), toSecondsPart(). Here's the sample code:

Duration duration = Duration.ofSeconds(3661); String formatted = String.format( "%dd %dh %dm %ds", duration.toDaysPart(), duration.toHoursPart(), duration.toMinutesPart(), duration.toSecondsPart() ); System.out.println(formatted); // Prints: "1d 1h 1m 1s". Ain't it pretty?

For Java 8 where these specific methods aren't available, extract each component manually:

Duration duration = Duration.ofSeconds(3661); long days = duration.toDays(); long hours = duration.minusDays(days).toHours(); long minutes = duration.minusHours(hours).toMinutes(); long seconds = duration.minusMinutes(minutes).getSeconds(); String formatted = String.format( "%dd %dh %dm %ds", days, hours, minutes, seconds ); System.out.println(formatted); // Java 8 says: "Challenge accepted and completed!"

Sprucing Up Java 8 with Regex

When Duration.toString() doesn't cut it in Java 8, try Regex to the rescue! Apply it to snip away unneeded data or tailor-make it to your needs.

Upgrading Your Human-Readable Output

Apache's commons-lang steps in with DurationFormatUtils.formatDurationWords translating a duration into an English sentence. Useful when your app talks to humans, not machines.

Enlisting Joda-Time for Big Durations

Seconds running into gazillions? Joda-Time library conquers large millisecond counts with Period methods and PeriodFormat.getDefault().print for a quick output. It's like splitting a huge pie into yummy slices.

Enter ThreeTen-Extra for Comprehensive Formatting

ThreeTen-Extra project brings a different flavor. Their wordBased format offers a comprehensive yet intuitive duration format. Who said Java can't be English-friendly?

Tackling Big Durations with Precision

Joda-Time library's toPeriod() method converts Duration to Period object. Imagine transforming a beastly number into a friendly list. High-five, Joda!

For the brave hearts on Java 8, whip up your own method using ofHours(), ofMinutes(), and ofSeconds(). It's like building a Lego model... piece by piece.

Java 9+'s Custom Shot at Formatting

Java 9+ ramps up the game. String.format helps customize duration with placeholders. Its hand-in-glove fit with duration components makes it a programmer's delight.

Handy Tips for Stripping off Spaces

When in doubt, kick out. Omit spaces to enhance readability, for example "4d1h3m5s". It's like packing a suitcase, every millimeter counts!

Feel the Power with PeriodFormatterBuilder

When special time units are in play, leverage PeriodFormatterBuilder with .appendX methods. It's like choosing your own toppings on a pizza, control remains with you!

Time Zones: Global Apps' Achilles Heel

Calling all global applications. Don't ignore time zones. Duration doesn't carry time zone info, so you handle the conversion genie before you rub the formatting lamp.

Prioritizing Perception over Precision

User's perception matters. When we think of time, we often round off seconds to minutes or minutes to hours. Use these psychic rules when coding the duration display.

Handling Legacy Systems

Wrestling with Java 7 or earlier? Look up backport libraries like ThreeTen-Backport or devise custom methods. Because 'old is gold'... but sometimes, gold needs a little polish.