How to format range of two LocalDate variables in Java?

Viewed 58

I'm familiar with the DateTime Formatter in regards to applying LocalDate to a single variable, but don't know how to handle the following situation: I've two LocalDate variables, for example startOfWeek and endOfWeek. And I need to create String result with following rules:

  1. if startOfWeek and endOfWeek have same month and year, the result should be like 3 - 9 Jan 2021 (just an example with format)
  2. if startOfWeek and endOfWeek have not same month, the result should be like 31 Oct - 6 Nov 2021
  3. if startOfWeek and endOfWeek have not same year, the result should be like 27 Dec 2020 - 2 Jan 2021

I didn't find how to apply DateTime Formatter working with two of more LocalDate variables, so I've made this way:

if ((startOfWeek.getYear() != endOfWeek.getYear())){
                result.append(startOfWeek.getDayOfMonth() + " " + startOfWeek.getMonth() + " " + startOfWeek.getYear() +
                        " - " + endOfWeek.getDayOfMonth() + " " + endOfWeek.getMonth() + " " + startOfWeek.getYear());
                return  result.toString();
            } else if ((startOfWeek.getMonth() != endOfWeek.getMonth())) {
                result.append(startOfWeek.getDayOfMonth() + " " + startOfWeek.getMonth() +
                        " - " + endOfWeek.getDayOfMonth() + " " + endOfWeek.getMonth() + " " + startOfWeek.getYear());
                return  result.toString();
            } else {
                result.append(startOfWeek.getDayOfMonth() +
                        " - " + endOfWeek.getDayOfMonth() + " " + startOfWeek.getMonth() + " " + startOfWeek.getYear());
                return  result.toString();

But it return information about months in default format, for example SEPTEMBER

Full example:

Does anybody now how to fix month data format or how to use DateTime Formatter with two LocalDate variables at one time? Thank you in advance for your help.

3 Answers

You could use a DateTimeFormatter to get a formated month string

DateTimeFormatter month  = DateTimeFormatter.ofPattern("MMM");

In addition to that I would do the task with 3 DateTimeFormatters and the YearMonth and Year classes from java.time API which could make your if else blocks a bit more readable:

import java.time.LocalDate;
import java.time.Year;
import java.time.YearMonth;
import java.time.format.DateTimeFormatter;
import java.util.List;

....


static String formattedRange (LocalDate start, LocalDate end){
    DateTimeFormatter onlyDate      = DateTimeFormatter.ofPattern("d");
    DateTimeFormatter dateAndMonth  = DateTimeFormatter.ofPattern("d MMM");
    DateTimeFormatter dateMonthYear = DateTimeFormatter.ofPattern("d MMM yyyy");

    StringBuilder result = new StringBuilder();
    if (YearMonth.from(start).equals(YearMonth.from(end))){
        result.append(onlyDate.format(start)).append(" - ")
              .append(dateMonthYear.format(end));
    }
    else if (Year.from(start).equals(Year.from(end))){
        result.append(dateAndMonth.format(start)).append(" - ")
              .append(dateMonthYear.format(end));
    }
    else {
        result.append(dateMonthYear.format(start)).append(" - ")
              .append(dateMonthYear.format(end));
    }
    return result.toString();
}

I would just use a Formatter string:

String format;
if (startOfWeek.getYear() != endOfWeek.getYear()) {
    format = "%te %<tb %<tY - %te %<tb %<tY";
} else if (startOfWeek.getMonth() != endOfWeek.getMonth()) {
    format = "%te %<tb - %te %<tb %<tY";
} else {
    format = "%te - %te %<tb %<tY";
}

return String.format(format, startOfWeek, endOfWeek);

You can use the .getDisplayName(...) method directly on the getMonth() method to get the desired localized month name format. In your case, here is an example code:

startOfWeek.getMonth().getDisplayName(TextStyle.SHORT_STANDALONE,Locale.getDefault())
endOfWeek.getMonth().getDisplayName(TextStyle.SHORT_STANDALONE, Locale.getDefault())
Related