Java 9. Duration parts, truncation and division.
Java 9 is introducing few new methods in Duration class. Before we jump into the details let’s have a quick recap what Duration is. JavaDoc defines it as the time-based amount of time which is immutable and thread-safe.
Duration.ofHours(-7) // PT-7H
Duration.ofHours(7) // PT7H
Duration.ofSeconds(70) // PT1M10S
Duration.ofNanos(300) // PT0.0000003S
Duration.ofMinutes(-63) // PT-1H-3M S
Duration.ofMinutes(-57) // PT-57M
In the comment on the right, you can see what output goes to console. The output is using format PTnHnMnS. If n = 0 then this part is not displayed. We can parse the output from the string as well.
Duration.parse(“PT7H”) // PT7H
It’s not always straightforward:
Duration.parse(“-PT-6H+3M”)
Is it going to work? Yes. It prints PT5H57M. So, seems like it’s able to calculate the time for you.
Duration.parse(“-PT-6H+3M+7M”)
Is it going to work? We can simplify this to the -PT-6H+10M. So the answer is. No, it won’t. This is not calculator expression. Let’s jump now to the fresh methods introduced in Java 9.
Extracting precision parts
Already in Java 8 we were able to type:
Duration.ofMinutes(130).toMinutes() // 130
Now, we have new method, with the Part suffix:
Duration.ofMinutes(130).toMinutesPart() // 10
In other words, it returns clock number of minutes. The source code behind is also quite trivial:
public int toMinutesPart() {
return (int) (toMinutes() % MINUTES_PER_HOUR);
}
The same is available for other precisions like Hours, Days, etc.
Truncate
In Apache Commons we were able to perform something like:
DateUtils.truncate(new Date(), Calendar.DATE)
Now, similar approach applies to the Duration.
Duration.ofMinutes(130) // PT2H10M
Duration.ofMinutes(130).truncatedTo(ChronoUnit.HOURS) // PT2H
Duration.ofMinutes(130).truncatedTo(ChronoUnit.DAYS) // PT0S
Duration.ofHours(23).truncatedTo(ChronoUnit.DAYS) // PT0S
Duration.ofHours(25).truncatedTo(ChronoUnit.DAYS) // PT24H
Divide
Another new method is dividedBy. Here we can check how many full periods we can fit into specific duration.
Duration.ofHours(25).dividedBy(Duration.ofHours(12)) // 2
Duration.ofHours(9).dividedBy(Duration.ofHours(2)) // 4
Internally, this is operating on the big decimal numbers. No problems with the approximation even with big numbers.
Next Java 9 insights coming soon. In mean time you can find out how Java defines “forever”.