如何格式化 Java 中两个 LocalDate 变量的范围?

How to format range of two LocalDate variables in Java?

我熟悉有关将 LocalDate 应用于单个变量的 DateTime Formatter,但不知道如何处理以下情况: 我有两个 LocalDate 变量,例如 startOfWeek 和 endOfWeek。 我需要使用以下规则创建字符串结果:

  1. 如果 startOfWeek 和 endOfWeek 有相同的月份和年份,结果应该是这样的 3 - 2021 年 1 月 9 日(只是格式示例)
  2. 如果 startOfWeek 和 endOfWeek 不是同一个月,结果应该类似于 2021 年 10 月 31 日 - 11 月 6 日
  3. 如果 startOfWeek 和 endOfWeek 不是同一年,结果应该是 2020 年 12 月 27 日 - 2021 年 1 月 2 日

我没有找到如何应用 DateTime Formatter 来处理另外两个 LocalDate 变量,所以我这样做了:

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();

但它 return 默认格式的月份信息,例如 SEPTEMBER

Full example:

现在有人知道如何修复月份数据格式或如何同时将 DateTime Formatter 与两个 LocalDate 变量一起使用吗? 预先感谢您的帮助。

您可以直接在 getMonth() 方法上使用 .getDisplayName(...) 方法来获取所需的本地化月份名称格式。对于您的情况,这是一个示例代码:

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

您可以使用 DateTimeFormatter 来获取格式化的月份字符串

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

除此之外,我会用 3 DateTimeFormatters 和 YearMonthYear 类 从 java.time API 这可以使您的 if else 块更具可读性:

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();
}

我只使用 Formatter 字符串:

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);