我正在尝试使用我在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。
感谢。
答案 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)
syyskuu
和syyskuuta
都是芬兰语中September
的正确拼写。第一个用于独立使用,第二个用于上下文。
java.time.Month
枚举可以提供任何一种拼写形式。
我使用现代java.time类而不是过时的java.util.Date
和java.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 );
- syyskuuta 2012
醇>
如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
来期待独立版本(我不知道这是否可行,只是一个想法)。