在java.time中本地化“MonthDay”或“YearMonth”类中的字符串?
java 8和以后版本中内置的java.time类提供了在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 无论如何,是否要通过定义格式模式而不是显式定义格式模式来自动化这些变化 我使用面向
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中修复的可能性有多大?