在java.time中本地化“MonthDay”或“YearMonth”类中的字符串?

在java.time中本地化“MonthDay”或“YearMonth”类中的字符串?,java,date,java-time,2-digit-year,Java,Date,Java Time,2 Digit Year,java 8和以后版本中内置的java.time类提供了MonthDay和YearMonth类。他们的toString和parse方法使用标准格式(--MM-DD&YYYY-MM),这是明智的 对于向人类演示,标准格式可能不适合。是否可以生成自动本地化的字符串来表示MonthDay或YearMonth对象中的值 例如,在美国,用户通常希望月日为MM/DD,年月为MM/YY。而在英国,用户可能希望月日为DD/MM 无论如何,是否要通过定义格式模式而不是显式定义格式模式来自动化这些变化 我使用面向

java 8和以后版本中内置的java.time类提供了
MonthDay
YearMonth
类。他们的
toString
parse
方法使用标准格式(
--MM-DD
&
YYYY-MM
),这是明智的

对于向人类演示,标准格式可能不适合。是否可以生成自动本地化的字符串来表示
MonthDay
YearMonth
对象中的值

例如,在美国,用户通常希望月日为MM/DD,年月为MM/YY。而在英国,用户可能希望月日为DD/MM

无论如何,是否要通过定义格式模式而不是显式定义格式模式来自动化这些变化


我使用面向日期的本地化格式化程序尝试了以下代码

Locale l = Locale.US;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate ( FormatStyle.SHORT ).withLocale ( l );

YearMonth ym = YearMonth.of ( 2017 , Month.JANUARY );
MonthDay md = MonthDay.of ( Month.JANUARY , 29 );

String outputYm = ym.format ( f );
String outputMd = md.format ( f );
该代码失败,在用于
YearMonth
MonthDay
时引发异常

对于
YearMonth

线程“main”java.time.temporal.UnsupportedTemporalTypeException:不支持的字段:DayOfMonth中的异常 在java.time.YearMonth.getLong(YearMonth.java:494) 位于java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298) 位于java.time.format.DateTimeFormatterBuilder$numberParser.format(DateTimeFormatterBuilder.java:2540) 位于java.time.format.DateTimeFormatterBuilder$CompositeInterparser.format(DateTimeFormatterBuilder.java:2179) 位于java.time.format.DateTimeFormatterBuilder$LocalizedParser.format(DateTimeFormatterBuilder.java:4347) 位于java.time.format.DateTimeFormatterBuilder$CompositeInterparser.format(DateTimeFormatterBuilder.java:2179) 位于java.time.format.DateTimeFormatter.formato(DateTimeFormatter.java:1746) 位于java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1720) at java.time.YearMonth.format(YearMonth.java:1073) 在javatimestaff.App.doIt(App.java:56) 在javatimestaff.App.main(App.java:45) 对于
月日

线程“main”java.time.temporal.UnsupportedTemporalTypeException:不支持的字段:YearOfEra中的异常 在java.time.MonthDay.getLong(MonthDay.java:451) 位于java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298) 位于java.time.format.DateTimeFormatterBuilder$numberParser.format(DateTimeFormatterBuilder.java:2540) 位于java.time.format.DateTimeFormatterBuilder$CompositeInterparser.format(DateTimeFormatterBuilder.java:2179) 位于java.time.format.DateTimeFormatterBuilder$LocalizedParser.format(DateTimeFormatterBuilder.java:4347) 位于java.time.format.DateTimeFormatterBuilder$CompositeInterparser.format(DateTimeFormatterBuilder.java:2179) 位于java.time.format.DateTimeFormatter.formato(DateTimeFormatter.java:1746) 位于java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1720) at java.time.MonthDay.format(MonthDay.java:646) 在javatimestaff.App.doIt(App.java:57) 在javatimestaff.App.main(App.java:45) 请参阅。JDK中需要一个增强来简化这一过程

可以在JDK之外做这些工作,但这是一项艰巨的工作。您必须解析CLDR XML文件(这些文件相互关联并且有许多引用)。然后提取
MonthYear
YearMonth
的相关本地化模式,然后可以使用这些模式创建
DateTimeFormatter


或者,您可以根据您的业务需要硬编码映射-
map

可能您正在寻找与
MonthDay.format(DateTimeFormatter)
相关的内容?@LouisWasserman添加了代码,以显示
DateTimeFormatter.ofcalizeddate
格式中失败()
方法包括
月日
年月
。如果你有一个变化,工作,请张贴。我不知道答案是否存在,但我不知道如何解决。JDK-8168532在Java10中修复的可能性有多大?