在法语中,缩写的月份名称后面有一个句点。
请参见耶鲁大学图书馆的这个页面,
月份名称缩写。列出了几十种语言。
“mars”是三月的全名(四个字母)。该名称太短,不需要缩写。没有缩写,所以没有句点。五月,“mai”,六月,“juin”,和八月,“août”也是一样。
此外,正如您可能已经注意到的那样,在法语中首字母是小写的,而在英语中是大写的。
Joda-Time
我在Mac OS X Mountain Lion上的Java 8中尝试了
Joda-Time 2.4。[跳转到java.time,Joda-Time的替代品]
LocalDate localDate = DateTimeFormat.forPattern( "dd MMM yyyy" ).withLocale( java.util.Locale.FRENCH ).parseLocalDate( "10 juil 2014" );
同样的问题:缺少句号
juillet
和juil.
都可以成功解析为法语,但juil
失败并抛出异常。月份缩写应该有一个句号终止符。
解决方法:插入句号
让我们使用substring
和lastIndexOf
来拆分字符串,添加句号并重新构建字符串。
测试字符串是否包含:"janv"、"févr"、"avr"、"juil"、"sept"、"oct"、"nov"、"déc"。注意在两侧使用空格以防止获取到完整的月份名称而不是缩写。
String inputRaw = "10 juil 2014";
int indexOfSecondSpace = inputRaw.lastIndexOf( " " );
String input = inputRaw.substring( 0, indexOfSecondSpace ) + "." + inputRaw.substring( indexOfSecondSpace );
DateTimeFormatter formatter = DateTimeFormat.forPattern( "dd MMM yyyy" ).withLocale( java.util.Locale.FRENCH );
LocalDate localDate = formatter.parseLocalDate( input );
System.out.println( inputRaw + " → " + input + " → " + localDate );
运行时。
10 juil 2014 → 10 juil. 2014 → 2014-07-10
或者调用replace
进行替换:
- " janv " → " janv. "
- " févr " → " févr. "
- " avr " → " avr. "
- " juil " → " juil. "
- " sept " → " sept. "
- " oct " → " oct. "
- " nov " → " nov. "
- " déc " → " déc. "
合理性检查
在实际环境中,我会添加一些合理性检查来确保输入符合我们的期望,例如在中间有两个空格,在开头和结尾没有空格。
java.time
Java 8及更高版本内置了java.time框架。这些新类替代了已被证明设计不良、令人困惑且麻烦的旧java.util.Date/.Calendar和相关类。新的java.time类受到Joda-Time的启发,由JSR 310定义,由ThreeTen-Extra项目扩展,解释在Oracle教程中,并被回溯到Java 6和7,以及回溯到Android。
java.time类包括方便的Month
枚举。 getDisplayName
生成本地化月份名称。
同样,DateTimeFormatter
类也生成本地化文本。调用ofLocalized…
方法。
System.out.println ( "US | Québec | France" );
for ( Month month : Month.values () ) {
TextStyle style = TextStyle.SHORT;
String us = month.getDisplayName ( style , Locale.US );
String quebec = month.getDisplayName ( style , Locale.CANADA_FRENCH );
String france = month.getDisplayName ( style , Locale.FRANCE );
System.out.println ( us + " | " + quebec + " | " + france );
}
我们在java.time中得到了与Joda-Time相同的行为:
在法语中,缩写月份后面有一个句点。 月份名称全部小写。
US | Québec | France
Jan | janv. | janv.
Feb | févr. | févr.
Mar | mars | mars
Apr | avr. | avr.
May | mai | mai
Jun | juin | juin
Jul | juil. | juil.
Aug | août | août
Sep | sept. | sept.
Oct | oct. | oct.
Nov | nov. | nov.
Dec | déc. | déc.
DateFormatSymbols.getInstance(Locale.FRENCH).getShortMonths()
。一些缩写名称甚至带有重音符号。 - tobias_k