无法解析芬兰语区域设置中的日期

时间:2012-09-25 06:58:00

标签: java android date locale

我正在尝试使用我在Stack Overflow上找到的示例来解析芬兰语日期,但我一直在获得解析异常。

这是我的代码段:

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

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

这是information about the Finnish locale

感谢。

2 个答案:

答案 0 :(得分:3)

似乎所有芬兰语日期都以ta结尾,即syyskuu变为syyskuuta

我给出的语言环境引用是错误的。如果您看到该链接,您会注意到ta缺失,这是一些误导性信息。我无法在Javadocs中找到芬兰语语言环境的确切语言环境信息。

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

以下是我测试代码的方式:

Date datDate = dftFormat.parse("25 syyskuuta 2012");
System.out.println(new SimpleDateFormat("dd MMMM yyyy").format(datDate));

答案 1 :(得分:2)

TL;博士

syyskuusyyskuuta都是芬兰语中September的正确拼写。第一个用于独立使用,第二个用于上下文。

java.time.Month枚举可以提供任何一种拼写形式。

java.time

我使用现代java.time类而不是过时的java.util.Datejava.text.SimpleDateFormat类来尝试使用相同类型的代码。

Java 8及更高版本中内置的java.time框架。见Oracle Tutorial。许多java.time功能都被反向移植到Java 6& ThreeTen-Backport中的7,并在ThreeTenABP中进一步适应Android。

日期值的格式化字符串

对于此示例,我们根据问题为2012年9月25日实例化LocalDate

LocalDate ld = LocalDate.of ( 2012 , Month.SEPTEMBER , 25 );  // 2012-09-25

我们得到一个DateTimeFormatter来生成一个String时自动本地化。调用ofLocalizedDate表示我们的String仅代表日期时间值的日期部分。 FormatStyle控制字符串的长度(完整,长,中,短)。

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG );

接下来,我们将JVM’s current default Locale的分配替换为Finland& Finnish语言环境。这个Locale对象确定了两件事:(a)用于翻译诸如日期名称或月份名称等部分的人类语言,以及(b)缩写的文化规范,首先订购月份或日期等元素,使用逗号与句点等等。

Locale locale = new Locale ( "fi" , "FI" );
formatter = formatter.withLocale ( locale );

使用该格式化程序实际生成String来表示我们的LocalDate值。

String output = ld.format ( formatter );  // 25. syyskuuta 2012

转储到控制台。

System.out.println ( "ld: " + ld + " with locale: " + locale + " | output: " + output );
  
      
  1. syyskuuta 2012
  2.   

accepted Answer所示,java.time同意syyskuuta是9月份的月份名称。

显示的月份名称

java.time类包括Month enum。这个方便的类有一个功能,用于生成一个字符串,其中月份的名称已本地化为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的{​​{1}}。
  • 在特定日期时间值的上下文中使用时,请syyskuu包含ta
  

完全| syyskuuta

     

FULL_STANDALONE | syyskuu

     

简短| syyskuuta

     

SHORT_STANDALONE | syys

     

NARROW |小号

     

NARROW_STANDALONE |小号

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