工作日的德语字符串输入到 Localdate

String input of weekdays in German to Localdate

我有一个德语工作日字符串输入,需要获取今天之后的下一个 Localdate,它对应于给定的工作日字符串。例如,如果输入是 Montag(星期一),我需要输出为 2022-05-16Localdate,即今天之后的下一个星期一。如果输入的是英文,我可以这样做:

String input = "Monday";

LocalDate today       = LocalDate.now();
LocalDate nextWeekday = today.with(TemporalAdjusters.next(DayOfWeek.valueOf(input.toUpperCase())));

System.out.println(nextWeekday);

有什么我可以做的吗,可能是使用 Locale,使用德语中给出的字符串(天)来获取下一个工作日作为 Localdate?如果可能而不定义我自己的枚举?我想避免做

public enum DayOfWeekGerman {
  MONTAG,
  DIENSTAG,
  MITTWOCH,
  ...
  //methods & getters
}

并以某种方式映射它们以使用 java.time API 方法,例如 Localdate.with...

java.time的类是数据类。他们没有语言环境。它们恰好是英文名称,只是因为 Java 语言本身是英文的。

但是,您可以创建一个 Map 来从名称中查找 DayOfWeek 值:

private static final Map<String, DayOfWeek> germanDaysOfWeek =
    Arrays.stream(DayOfWeek.values()).collect(
        Collectors.toMap(
            d -> d.getDisplayName(TextStyle.FULL, Locale.GERMAN), d -> d));

{Freitag=FRIDAY, Samstag=SATURDAY, Montag=MONDAY, Mittwoch=WEDNESDAY, Donnerstag=THURSDAY, Dienstag=TUESDAY, Sonntag=SUNDAY}

对该地图执行查找。

String input = "Montag";

LocalDate today = LocalDate.now();
LocalDate nextWeekday = today.with(
    TemporalAdjusters.next(germanDaysOfWeek.get(input)));

查看所有这些 code run live at Ideone.com

2022-05-16

考虑到今天是09/May/2022 (Monday),你可以试试:

String input = "Montag";
LocalDate today       = LocalDate.now();
DayOfWeek weekday = DayOfWeek.from(
        DateTimeFormatter.ofPattern("EEEE", Locale.GERMAN).parse(input));
LocalDate nextWeekday = today.with(TemporalAdjusters.next(weekday));
System.out.println(nextWeekday);

输出:

2022-05-16

如果您在其他任何一天执行它,您可能会根据星期和日期得到不同的输出。