This question already has answers here:
How to format YearMonth and MonthDay depending on a Locale?
(3个答案)
3年前关闭。
Java 8和更高版本中内置的java.time类提供了
为了向人类展示,标准格式可能不适合。无论如何,有没有生成一个自动本地化的字符串来表示
例如,在美国,用户通常可能希望MM / DD表示月日,而MM / YY表示年月。在英国,用户可能需要一个月日的DD / MM。
无论如何要通过
我使用面向日期的本地化格式化程序尝试了以下代码。
该代码失败,当用于
对于
对于
(3个答案)
3年前关闭。
Java 8和更高版本中内置的java.time类提供了
MonthDay
和YearMonth
类。他们的toString
和parse
方法使用标准的ISO 8601格式(--MM-DD
和YYYY-MM
),这是明智的。为了向人类展示,标准格式可能不适合。无论如何,有没有生成一个自动本地化的字符串来表示
MonthDay
或YearMonth
对象中的值?例如,在美国,用户通常可能希望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 );
该代码失败,当用于
YearMonth
或MonthDay
时引发异常。对于
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文件(这些文件相互链接并且具有许多引用)。然后为MonthYear
和YearMonth
提取相关的本地化模式,然后可以使用这些模式创建DateTimeFormatter
。
另外,您可以根据业务需求对地图-Map<Locale, DateTimeFormatter>
进行硬编码。
10-07 19:01