Format a Date interval in Java
At the time of this writing, there are a gazillion ways to print dates in Java:
- SimpleDateFormat (deprecated, use java.time instead)
- Joda time (deprecated, use java.time instead)
- Threeten (deprecated, use java.time instead)
- Java 8 Date/Time API (also known as java.time) <== This. You should be using this. Use this.
The problem is, how do we print a date interval in Java? None of these libraries supports this particular use case. Duration
is not a date interval, and neither is Period
. ZonedDateTime.format
is great, but only supports a single date. There are no libraries out there to format an interval of dates, as far as we could see.
Enter String.format
, described in the javadoc for Formatter
. This is a method typically used to interpolate values inside Strings:
String.format("foo %s", "bar"); // return "foo bar"
This method also supports internationalization when passing a Locale as first argument. You know where we are going, right?
var start = parseISO8601("2020-01-02T10:10:00Z");
var end = parseISO8601("2020-02-03T10:10:00Z");
Locale locale = Locale.ENGLISH;
// please don't do this in real code - use .properties instead
String pattern = "en".equals(locale.getLanguage())?
// "January 2 - February 3, 2020"
"%1$tB %1$te - %2$tB %2$te, %1$tY",
// 2 de enero - 3 de febrero de 2020
"%1$te de %1$tB - de %2$te %2$tB de %1$tY";
return String.format(locale, pattern, start, end);
According to the docs, %1$te
can be used to indicate the following:
The same date can be used more than once, and the order can be rearranged depending on the locale. The rest is playing with other options: extract the year, month names, whatever. Go crazy.