首页 > 解决方案 > JSR310 如何将月日模式国际化?

问题描述

我试图格式化没有年份的日期(只是日期和月份,例如12.10

DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT)对我来说仍然是一年(12.10.20)。

所以我尝试DateTimeFormatter.ofPattern("dd. MM")了,但这显然对order 和 dot 进行了硬编码,这不会让美国用户满意。(谁期望斜线和月份优先)

如何使模式国际化?分隔符等是否有一些抽象语法?

标签: javalocalizationdate-formattingjava-timejsr310

解决方案


好吧,正如 Ole 指出的那样,java.time仅使用没有 100% 令人满意的解决方案。但是我的库Time4J找到了一个基于 CLDR 存储库数据的解决方案(ICU4J 也提供支持),使用类型为AnnualDate(作为替代MonthDay):

LocalDate yourLocalDate = ...;
MonthDay md = MonthDay.from(yourLocalDate);
AnnualDate ad = AnnualDate.from(md);

ChronoFormatter<AnnualDate> usStyle =
  ChronoFormatter.ofStyle(DisplayMode.SHORT, Locale.US, AnnualDate.chronology());
ChronoFormatter<AnnualDate> germanStyle =
  ChronoFormatter.ofStyle(DisplayMode.SHORT, Locale.GERMANY, AnnualDate.chronology());
System.out.println("US-format: " + usStyle.format(ad)); // US-format: 12/31
System.out.println("German: " + germanStyle.format(ad)); // German: 31.12.

推荐阅读