如何根据语言环境格式化YearMonth和MonthDay?

可以LocalDate使用特定格式在Java 8中格式化Locale

DateTimeFormatter.ofLocalizedDate(FormatStyle.SHORT).withLocale(myLocale).format(value);

DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(myLocale).format(value);

DateTimeFormatter.ofLocalizedDate(FormatStyle.LONG).withLocale(myLocale).format(value);

DateTimeFormatter.ofLocalizedDate(FormatStyle.FULL).withLocale(myLocale).format(value);

假设value = LocalDate.now()这将导致:

// myLocale = Locale.ENGLISH

6/30/16

Jun 30, 2016

June 30, 2016

Thursday, June 30, 2016

// myLocale = Locale.GERMAN

30.06.16

30.06.2016

30. Juni 2016

Donnerstag, 30. Juni 2016

// myLocale = new Locale("es", "ES")

30/06/16

30-jun-2016

30 de junio de 2016

jueves 30 de junio de 2016

如您所见,Java决定使用哪个定界符(“-”,“。”,“

/”,“”等)以及如何对日期元素进行排序(例如,在某些语言环境中是月日,反之亦然,等等)可能是那一年来的第一,等等。

如何格式化java.time.YearMonthjava.time.MonthDay取决于Locale上面的示例?

根据示例,我希望得到这样的结果…

…用于YearMonth

// myLocale = Locale.ENGLISH

6/16

Jun, 2016

June, 2016

June, 2016

// myLocale = Locale.GERMAN

06.16

06.2016

Juni 2016

Juni 2016

// myLocale = new Locale("es", "ES")

06/16

jun-2016

de junio de 2016

de junio de 2016

…用于MonthDay

// myLocale = Locale.ENGLISH

6/30

Jun 30

June 30

June 30

// myLocale = Locale.GERMAN

30.06.

30.06.

30. Juni

30. Juni

// myLocale = new Locale("es", "ES")

30/06

30-jun

30 de junio de

30 de junio de

当然,可能还有其他Locale使用完全不同的定界符和顺序的。

谢谢!

回答:

似乎无法在Java-9中修复此Java-8错误,因为即使feature-

extension-complete-

date也已经结束。让我们看看它是否将在Java-10中得到修复,而Java-10仍然有很长的路要走…

当然,正如此处的一个答案所建议的那样,您可以尝试处理给定的本地化日期模式以删除不相关的部分。但是我仍然认为这种方法容易出错,因为周围仍然有很多语言环境。实际上,对于中国人来说,公认的答案是有缺陷的。本地化文字是这里的主要问题。也许至少可以针对该重要语言确定可接受的答案,但是您可能还会考虑

a)ICU4J

DateFormat df = DateFormat.getInstanceForSkeleton(DateFormat.YEAR_MONTH, Locale.CHINESE);

String output = df.format(new Date());

System.out.println("ICU4J=" + output); // 2017年1月

但是,一个问题是与Java-8类型(尤其是MonthDay和)缺乏互操作性YearMonth。解决方案需要像“

Date.from(YearMonth.now().atDay(1).atStartOfDay(ZoneId.systemDefault()).toInstant());可能”

这样的东西,但麻烦。

b)我的库Time4J(与ICU4J具有相同的数据库)

ChronoFormatter<CalendarMonth> cf =

ChronoFormatter.ofStyle(DisplayMode.FULL, Locale.CHINESE, CalendarMonth.chronology());

CalendarMonth cm =

CalendarMonth.from(YearMonth.now()); // or: CalendarMonth.nowInSystemTime()

System.out.println("Time4J=" + cf.format(cm)); // 2017年1月

与Java-8的互操作性也存在相反的方向。而Time4J-counterpart的MonthDay是class

AnnualDate


旁注:@Julian收益率的中文可接受答案:2017年1(需要确定)

以上是 如何根据语言环境格式化YearMonth和MonthDay? 的全部内容, 来源链接: utcz.com/qa/411899.html

回到顶部