This question already has answers here:
Parsing a date with short month without dot
(6个答案)
5年前关闭。
我得到以下日期字符串
在用法语查询一年中月份的名称时,我看到
我尝试使用
但这引发了异常
然后,我尝试在月份名称之后添加句点
现在我得到以下输出
因此,看来我需要一个句点,但是当我尝试解析3月日期(
我应该如何解析法语日期?我可以分两步来做:首先有一个时期,然后没有一个时期,并希望其中一个会成功,但是还有更好的方法吗?
相同的问题:缺少期间
解决方法:插入期
让我们使用
测试字符串是否包含:“janv”,“févr”,“avr”,“juil”,“sept”,“oct”,“nov”,“déc”。请注意,如果您得到的字符串带有完整的月份名称而不是缩写,请注意在两侧都使用空格。
运行时。
或致电
“janv”→“janv。” “févr”→“févr。” “avr”→“avr。” “juil”→“juil。” “九月”→“九月” “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 Tutorial以及backported to Java 6 & 7中解释的backported to Android项目扩展。
java.time类包括方便的
同样,
在java.time中,我们得到与在Joda-Time中看到的相同的行为:在法语中,缩写的月份有一个句点。 ,月份名称完全是小写。
(6个答案)
5年前关闭。
我得到以下日期字符串
10 juil 2014
在用法语查询一年中月份的名称时,我看到
juil
是juillet
的缩写,它用英语指代July。我尝试使用
SimpleDateFormat
和French
语言环境来解析它:System.out.println(new SimpleDateFormat("dd MMM yyyy", Locale.FRENCH).parse("11 juil 2014"));
但这引发了异常
java.text.ParseException: Unparseable date: "11 juil 2014"
at java.text.DateFormat.parse(DateFormat.java:357)
然后,我尝试在月份名称之后添加句点
System.out.println(new SimpleDateFormat("dd MMM yyyy", Locale.FRENCH).parse("11 juil. 2014"));
现在我得到以下输出
Fri Jul 11 00:00:00 EDT 2014
因此,看来我需要一个句点,但是当我尝试解析3月日期(
mars
)时,如果添加了句点,则无法识别它。我应该如何解析法语日期?我可以分两步来做:首先有一个时期,然后没有一个时期,并希望其中一个会成功,但是还有更好的方法吗?
最佳答案
在法语中,缩写的月份名称带有句点。
参见耶鲁大学图书馆Abbreviations of the Names of the Months的本页。列出几十种语言。
“火星”是三月份的全名(四个字母)。这个名字太短了,不需要缩写。没有缩写,所以没有句号。 “mai”(5月),“juin”(6月)和août(8月)也是如此。
另外,您可能已经注意到,第一个字母在法语中为小写,在英语中为大写。
乔达时代
我在Mac OS X Mountain Lion的Java 8中的Joda-Time 2.4中进行了尝试。 [赶快 catch Joda-Time的替代者java.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
进行以下替换:完整性检查
在现实世界中,我将添加一些合理性检查以确保输入内容符合我们的期望,例如中间有两个空格,开头或结尾没有空格。
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类包括方便的
Month
enum。 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.