【问题标题】:Dealing with month names in different languages处理不同语言的月份名称
【发布时间】:2017-09-16 22:44:12
【问题描述】:

我输入了许多不同格式的日期。我基本上是在尝试采用所有不同的格式并将它们标准化为 ISO 8601 格式。

如果日期包含月份名称,例如 March,那么我使用以下函数来获取月份编号,例如03.

month = String.valueOf(Month.valueOf(month.toUpperCase()).getValue());

无论如何,我遇到的问题是月份名称有多种不同的语言,没有说明它们将是什么语言。运行上述函数时出现以下错误:

Caused by: java.lang.IllegalArgumentException: No enum constant java.time.Month.AUGUSTI
    at java.lang.Enum.valueOf(Enum.java:238)
    at java.time.Month.valueOf(Month.java:106)

是否有任何库可以处理多种不同语言的月份名称,返回数值,甚至只是将月份名称翻译成英文?

这是输入日期的示例:

1370037600
1385852400
1356994800
2014-03-01T00:00:00
2013-06-01T00:00:00
2012-01-01
2012
May 2012
März 2010
Julio 2009

【问题讨论】:

  • 为什么不使用标准 Java 库中提供的支持来解析日期?您需要解析的输入到底是什么?
  • @JBNizet 我已经更新了添加输入数据的问题。如您所见,格式都非常不同。关于为什么我不使用标准 Java 库中提供的支持:我不确定如何使用给定的输入来做到这一点。另外,不确定 Java.time.Month 如何不是标准 Java。
  • 好的。你如何解析它们?你怎么知道语言是什么?你怎么知道每个输入的格式是什么?你怎么知道胡里奥是一个月而不是一天?
  • @JBNizet 我编译了一些模式(例如,^\d{4}$、^(\d{4}-\d{2}-\d{2})、\\w+\ \s+\\d{4} 等)。我要注意的一件事是,输入数据确实匹配至少一种模式,并且除了在月份名称不是英文时转换日期之外,一切正常。除上述 OP 中的例外情况外,所有其他方面都已弄清楚。
  • @sruetti,上述帖子中的输入数据涵盖了文件中的所有格式。我很想处理更好的数据,但不幸的是这不会发生。我的工作是标准化所有这些数据并创建更好的数据:)

标签: java datetime translation java-time date-parsing


【解决方案1】:

如果您不知道月份名称是什么语言,唯一的方法是遍历java.util.Locale 的所有可用值,使用java.time.format.DateTimeFormatter 并尝试解析月份,直到找到一个有效的值:

String input = "März 2010";
// formatter with month name and year
DateTimeFormatter fmt = DateTimeFormatter.ofPattern("MMMM yyyy");
Month month = null;
for (Locale loc : Locale.getAvailableLocales()) {
    try {
        // set the locale in the formatter and try to get the month
        month = Month.from(fmt.withLocale(loc).parse(input));
        break; // found, no need to parse in other locales
    } catch (DateTimeParseException e) {
        // can't parse, go to next locale
    }
}
if (month != null) {
    System.out.println(month.getValue()); // 3
}

在上面的代码中,月份为Month.MARCH,输出为3

【讨论】:

  • 如果您需要做很多事情,您可以改为格式化每个 Locale 的月份名称,并构建一个 Map<String, Month>。您可以将TreeMap 与忽略大小写和重音符号的Collator 结合使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多