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
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.
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.