在不同的语言与月份名称打交道

问题描述:

我有日期输入在许多不同的格式。我基本上试图采取所有不同的格式,并将其标准化为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 
+0

你为什么不只是解析日期,使用标准的Java库提供的支持?这到底需要解析的输入是什么? –

+0

@JBNizet我已经更新了添加输入数据的问题。如您所见,格式完全不同。关于为什么我没有使用标准Java库中提供的支持:我不知道如何使用给定的输入来完成此操作。另外,不确定Java.time.Month是不是标准的Java。 –

+0

好的。你如何解析它们?你怎么知道这门语言是什么?你怎么知道每个输入的格式是什么?你怎么知道胡里奥是一个月而不是一天? –

如果您在当月的名字是什么语言不知道,唯一的办法通过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'格式化月份名称,并建立一个'地图' 。您可以使用带有“Collat​​or”的'TreeMap'来忽略大小写和重音。 – Andreas