gpt4 book ai didi

java - 如何根据区域设置设置年月月日的格式?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:58:11 27 4
gpt4 key购买 nike

在 Java 8 中使用特定的 Locale 格式化 LocalDate 可以像这样实现:

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-8-bug无法在 Java-9 中修复,因为即使是 feature-extension-complete-date已经结束了。让我们看看它是否会在 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 类型的互操作性,尤其是 MonthDayYearMonth。解决方案需要类似 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月

Interoperability Java-8 也存在相反的方向。 MonthDay 的 Time4J 对应部分是 AnnualDate 类。


旁注:@Julian 接受的中文答案为:2017 年 1(需要修复)

关于java - 如何根据区域设置设置年月月日的格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38123151/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com