如何根据语言环境格式化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.ENGLISH6/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.YearMonth
和java.time.MonthDay
取决于Locale
上面的示例?
根据示例,我希望得到这样的结果…
…用于YearMonth
:
// myLocale = Locale.ENGLISH6/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.ENGLISH6/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