This question already has answers here:
How to format YearMonth and MonthDay depending on a Locale?
                                
                                    (3个答案)
                                
                        
                                3年前关闭。
            
                    
Java 8和更高版本中内置的java.time类提供了MonthDayYearMonth类。他们的toStringparse方法使用标准的ISO 8601格式(--MM-DDYYYY-MM),这是明智的。

为了向人类展示,标准格式可能不适合。无论如何,有没有生成一个自动本地化的字符串来表示MonthDayYearMonth对象中的值?

例如,在美国,用户通常可能希望MM / DD表示月日,而MM / YY表示年月。在英国,用户可能需要一个月日的DD / MM。

无论如何要通过Locale自动执行此类变体,而不是显式定义格式设置模式?



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

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


该代码失败,当用于YearMonthMonthDay时引发异常。

对于YearMonth

Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: DayOfMonth
    at java.time.YearMonth.getLong(YearMonth.java:494)
    at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
    at java.time.format.DateTimeFormatterBuilder$NumberPrinterParser.format(DateTimeFormatterBuilder.java:2540)
    at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2179)
    at java.time.format.DateTimeFormatterBuilder$LocalizedPrinterParser.format(DateTimeFormatterBuilder.java:4347)
    at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2179)
    at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1746)
    at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1720)
    at java.time.YearMonth.format(YearMonth.java:1073)
    at javatimestuff.App.doIt(App.java:56)
    at javatimestuff.App.main(App.java:45)


对于MonthDay

Exception in thread "main" java.time.temporal.UnsupportedTemporalTypeException: Unsupported field: YearOfEra
    at java.time.MonthDay.getLong(MonthDay.java:451)
    at java.time.format.DateTimePrintContext.getValue(DateTimePrintContext.java:298)
    at java.time.format.DateTimeFormatterBuilder$NumberPrinterParser.format(DateTimeFormatterBuilder.java:2540)
    at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2179)
    at java.time.format.DateTimeFormatterBuilder$LocalizedPrinterParser.format(DateTimeFormatterBuilder.java:4347)
    at java.time.format.DateTimeFormatterBuilder$CompositePrinterParser.format(DateTimeFormatterBuilder.java:2179)
    at java.time.format.DateTimeFormatter.formatTo(DateTimeFormatter.java:1746)
    at java.time.format.DateTimeFormatter.format(DateTimeFormatter.java:1720)
    at java.time.MonthDay.format(MonthDay.java:646)
    at javatimestuff.App.doIt(App.java:57)
    at javatimestuff.App.main(App.java:45)

最佳答案

请参见JDK-8168532。 JDK需要增强以使其变得容易。

可以在JDK之外进行工作,但这是很多工作。您必须解析CLDR XML文件(这些文件相互链接并且具有许多引用)。然后为MonthYearYearMonth提取相关的本地化模式,然后可以使用这些模式创建DateTimeFormatter

另外,您可以根据业务需求对地图-Map<Locale, DateTimeFormatter>进行硬编码。

10-07 19:01