当前位置: 首页 > 面试题库 >

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

云宜人
2023-03-14
问题内容

可以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(需要确定)



 类似资料:
  • 我在我的应用程序中使用日期格式化程序来显示一些日期。但我希望这个日期以阿拉伯语显示。所以我试图像这样改变格式化程序的区域设置: 但它不起作用。。 如果我改成这样: 会工作正常...但我希望日期显示在阿拉伯语... 如何做到这一点?我希望日期是例如١١ يناير ٢٠١٨..怎么办?

  • 问题内容: 我正在竭尽全力找到一种使用Java在各种语言环境中格式化外币的方法,这些语言不是默认设置。我发现了java.util.Currency,它可以表示用于各种语言环境的正确符号。也就是说,对于美元,它在美国为我提供了美元符号,在其他国家为我提供了美元或美元的符号。另外,我还找到了java.text.NumberFormat,它将为特定语言环境格式化货币。我的问题- util.Currenc

  • 问题内容: 我试图根据给定的语言环境以不同的方式格式化Java中的日期。例如,我希望英语用户看到“ 2009年11月1日”(格式为“ MMM d,yyyy”),而挪威用户希望看到“ 1. nov。2009”(“ d。MMM。yyyy”)。 如果将语言环境添加到SimpleDateFormat构造函数中,则月份部分工作正常,但是其余部分呢? 我希望可以将与语言环境配对的格式字符串添加到SimpleD

  • 问题内容: 我是Java和Android开发的新手,所以这可能是一个愚蠢的问题,但是我已经搜寻了好几天,却找不到解决方案: 我尝试根据用户的语言环境输出a 。 在StackOverflow上搜索使我想到了这一点: 输出: 在我的法语本地电话上。差不多了 我如何也输出 小时,分钟和秒部分 的,使用用户的语言环境?我一直在寻找android文档,但找不到任何东西。 非常感谢。 问题答案: 用 参考:h

  • 问题内容: 有没有一种方法可以用Java / Kotlin中的区域设置正确的格式格式化日期和月份(紧凑格式),而不格式化年份?因此,对于英语,应为“ 9月20日”,而对于瑞典语为“ 9月20日”。 为了进行比较,在Cocoa平台上,我可以执行以下操作(在Swift中): 这将正确地扭转局面。Java SDK是否有等效的功能?我一直在尝试使用旧API的各种形式,但都没有成功。 注意: 与这个问题不同

  • 当前状态: 我有一个使用Java 1.8.161、Maven 3.3.9、SpringBoot 2.0.1、工具Jenkins和GitLab构建的项目。我想使用google java格式作为整个团队的标准。 我的调查/解决方案: 在调查过程中,我找到了解决方案,这听起来很简单。只需更新pom文件: 而且很有效。如果我运行编译、打包、验证、安装或部署Maven lifecycle,代码就会格式化。