在法语中,缩写的月份名称有句号。
在耶鲁大学图书馆查看此页面,Abbreviations of the Names of the Months。列出了几十种语言。
“mars”是 March 的全称(四个字母)。这个名字很短,不需要缩写。没有缩写,所以没有句号。 “mai”(五月)、“juin”(六月)和 août(八月)也是如此。
此外,您可能已经注意到,第一个字母在法语中是小写的,而在英语中是大写的。
乔达时间
我在 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.”
- “七月”→“七月。”
- “九月”→“九月”
- “八月”→“八月”
- “十一月”→“十一月”
- “déc”→“déc.”
健全性检查
在现实世界中,我会添加一些健全性检查以确保输入符合我们的预期,例如中间有两个空格,开头或结尾没有空格。
java.time
Java 8 及更高版本带有内置的 java.time 框架。这些新类取代了旧的 java.util.Date/.Calendar 和相关类,这些类已被证明设计不佳、令人困惑和麻烦。新的 java.time 类受到 Joda-Time 的启发,由 JSR 310 定义,由 ThreeTen-Extra 项目扩展,在 Oracle Tutorial 和 backported to Java 6 & 7 以及 backported to Android 中进行了解释。
java.time 类包括方便的Monthenum。 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.