可以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.YearMonth
和java.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的各种形式,但都没有成功。 注意: 与这个问题不同
问题内容: 我遇到了一个非常奇怪的问题,听起来像是系统错误。我只想使用小时和分钟信息来格式化日期,并在必要时显示AM / PM。 这是我的代码: 如您所见,我正在使用而不使用,并且如Apple文档所述,如果用户选择12h格式,它应该自动添加AM / PM: 时间的表示可能是13:00。但是,在iOS中,如果用户将24小时制切换为关闭,则时间可能是1:00 pm。 我发现它可以在我的设备(我位于欧洲