java - 在 Java 中解析法国日期

标签 java

<分区>

我得到以下日期字符串

10 juil 2014

在法语中查找一年中的月份名称,我看到 juiljuillet 的缩写,在英语中指的是七月。

我尝试使用 SimpleDateFormatFrench 语言环境来解析它:

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

所以看起来我需要句点,但是当我尝试解析三月日期 (mars) 时,如果添加句点,则无法识别。

我应该如何解析法国日期?我可以分两次完成:第一次有句号,然后没有句号,希望其中一个能解决问题,但有没有更好的方法?

最佳答案

在法语中,缩写的月份名称有一个句点。

请参阅耶鲁大学图书馆的此页,Abbreviations of the Names of the Months .列出几十种语言。

“mars”是三月的全称(四个字母)。这个名字很短,不需要缩写。没有缩写,所以没有句号。 “mai”(五月)、“juin”(六月)和 août(八月)也是如此。

此外,您可能已经注意到,第一个字母在法语中是小写的,但在英语中是大写的。

乔达时间

我在 Joda-Time 中尝试过这个Mac OS X Mountain Lion 上的 Java 8 中的 2.4。 [跳转到 java.time,Joda-Time 的替代品]

LocalDate localDate = DateTimeFormat.forPattern( "dd MMM yyyy" ).withLocale( java.util.Locale.FRENCH ).parseLocalDate( "10 juil 2014" );

同样的问题:缺少经期

juilletjuil. 都成功解析为法语,但 juil 失败并抛出异常。月份缩写应该有一个句号终止符。

解决方法:插入句点

让我们使用substringlastIndexOf撕开字符串,添加句点,然后重建字符串。

测试字符串是否包含:“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.”
  • “九月”→“七月”
  • “八月”→“八月”
  • “11月”→“11月”
  • “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 类包括方便的 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.

关于java - 在 Java 中解析法国日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25001478/

相关文章:

java - Eclipse开发-获取编辑器中当前显示的行数

java - 如何使用java正则表达式识别字符的第四次出现

java - 如何使用 thymeleaf 和 spring 用列表填充下拉列表

java - 如何对 MongoDB 中的嵌入对象进行排序

java - 从数据集中读取并放入对象中

java - 使用密码加密消息java

java使用相同的 key 加密解密密码md5

Java Web 应用程序在 Heroku 上崩溃

java - 从 java 建立连接时,我们是否需要在 VM TrustStore 中添加经过验证的 CA?

Java - 是否可以在不强制转换的情况下读取序列化对象?