在不同的语言与月份名称打交道
问题描述:
我有日期输入在许多不同的格式。我基本上试图采取所有不同的格式,并将其标准化为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.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
。
+5
如果你需要做很多,你可以改为每一个'Locale'格式化月份名称,并建立一个'地图' 。您可以使用带有“Collator”的'TreeMap'来忽略大小写和重音。 – Andreas
你为什么不只是解析日期,使用标准的Java库提供的支持?这到底需要解析的输入是什么? –
@JBNizet我已经更新了添加输入数据的问题。如您所见,格式完全不同。关于为什么我没有使用标准Java库中提供的支持:我不知道如何使用给定的输入来完成此操作。另外,不确定Java.time.Month是不是标准的Java。 –
好的。你如何解析它们?你怎么知道这门语言是什么?你怎么知道每个输入的格式是什么?你怎么知道胡里奥是一个月而不是一天? –