tl;博士
syyskuu
和都是芬兰语syyskuuta
的正确拼写September
。第一个用于独立使用,第二个用于上下文。
枚举可以提供任何一种java.time.Month
拼写形式。
java.time
java.util.Date
我使用现代的 java.time 类而不是旧的过时的类尝试了这种相同的代码java.text.SimpleDateFormat
。
Java 8 及更高版本中内置的java.time框架。请参阅Oracle 教程。许多 java.time 功能在 ThreeTen-Backport 中向后移植到 Java 6 和 7,并在ThreeTenABP中进一步适应 Android 。
日期值的格式化字符串
对于此示例,我们根据问题实例化LocalDate
2012 年 9 月 25 日的 a。
LocalDate ld = LocalDate.of ( 2012 , Month.SEPTEMBER , 25 ); // 2012-09-25
我们得到一个DateTimeFormatter
在生成字符串时自动本地化的方法。调用ofLocalizedDate
意味着我们的字符串将仅代表日期时间值的日期部分。控制字符串的FormatStyle
长度(完整、长、中、短)。
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG );
接下来,我们将JVM 当前默认值Locale
的分配替换为芬兰和芬兰语言环境。该Locale
对象决定了两件事:(a) 用于翻译诸如日期名称或月份名称等片段的人类语言,以及 (b) 缩写、排序元素(例如月份或日期优先、逗号与句点的使用)的文化规范, 等等。
Locale locale = new Locale ( "fi" , "FI" );
formatter = formatter.withLocale ( locale );
使用该格式化程序实际生成 aString
来表示我们的LocalDate
值。
String output = ld.format ( formatter ); // 25. syyskuuta 2012
转储到控制台。
System.out.println ( "ld: " + ld + " with locale: " + locale + " | output: " + output );
- 西斯库塔 2012
如接受的答案所示,java.time 同意这syyskuuta
是九月的月份名称。
显示月份名称
java.time 类包括enum。这个方便的类具有生成字符串的功能,该字符串的月份名称本地化为.Month
Locale
这种本地化类似于我们在上面的代码中看到的本地化的想法。但不同的是使用不同的枚举来控制文本的长度。在这里,TextStyle
枚举(而不是FormatStyle
)提供了完整、窄和短……但也提供了这三种长度的“独立”版本。在某些语言中,单独使用文本时使用的单词与完整日期不同。只是为了好玩,让我们用芬兰语试试。
Locale locale = new Locale ( "fi" , "FI" );
EnumSet<TextStyle> styles = EnumSet.allOf ( TextStyle.class );
for ( TextStyle style : styles ) {
System.out.println ( style + " | " + Month.SEPTEMBER.getDisplayName ( style , locale ) );
}
谜团解开:独立月份名称
果然,下面的输出解释了这个谜团。芬兰语:
- 单独使用月份名称时,删除
ta
for syyskuu
。
- 在特定日期时间值的上下文中使用时,包括
ta
for syyskuuta
。
完整 | 西斯库塔
全独立 | 西斯库
简短 | 西斯库塔
SHORT_STANDALONE | 系统
窄 | 小号
NARROW_STANDALONE | 小号
如果您无法控制应用程序中格式不正确的输入,您可以搜索并用正确版本替换任何独立值。或者也许你可以DateTimeFormatterBuilder
期待独立版本(我不知道这是否可能,只是一个想法)。