3

我正在尝试使用我在 Stack Overflow 上找到的示例解析芬兰日期,但我不断收到解析异常。

这是我的片段:

SimpleDateFormat dftFormat = new SimpleDateFormat("dd MMMM yyyy", new Locale("fi", "FI"));
Date datDate = dftFormat.parse("25 syyskuu 2012");

这些DateFormat字符似乎与英文中的字符相同,所以我想知道为什么这不起作用。

这是有关芬兰语言环境的信息。

谢谢。

4

2 回答 2

3

似乎所有芬兰日期都以 ta iesyyskuu结尾syyskuuta

我提供的语言环境参考是错误的。如果您看到该链接,您会注意到ta缺少该链接,这是一些误导性信息。我在 Javadocs 中找不到芬兰语言环境的确切语言环境信息。

感谢@Eis 和@Fildor,我吸取了教训,使用您的解析格式打印出日期以查看结果字符串是什么。然后您可以使用该格式比较您的输入字符串是否可解析。

这是我测试代码的方法:

Date datDate = dftFormat.parse("25 syyskuuta 2012");
System.out.println(new SimpleDateFormat("dd MMMM yyyy").format(datDate));
于 2012-09-26T14:15:03.490 回答
2

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 。

日期值的格式化字符串

对于此示例,我们根据问题实例化LocalDate2012 年 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 );
  1. 西斯库塔 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 ) );
}

谜团解开:独立月份名称

果然,下面的输出解释了这个谜团。芬兰语:

  • 单独使用月份名称时,删除tafor syyskuu
  • 在特定日期时间值的上下文中使用时,包括tafor syyskuuta

完整 | 西斯库塔

全独立 | 西斯库

简短 | 西斯库塔

SHORT_STANDALONE | 系统

窄 | 小号

NARROW_STANDALONE | 小号

如果您无法控制应用程序中格式不正确的输入,您可以搜索并用正确版本替换任何独立值。或者也许你可以DateTimeFormatterBuilder期待独立版本(我不知道这是否可能,只是一个想法)。

于 2016-07-12T02:04:06.977 回答