2017-09-16 87 views
2

我有日期輸入在許多不同的格式。我基本上試圖採取所有不同的格式,並將其標準化爲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

好的。你如何解析它們?你怎麼知道這門語言是什麼?你怎麼知道每個輸入的格式是什麼?你怎麼知道胡里奧是一個月而不是一天? –

回答

4

如果您在當月的名字是什麼語言不知道,唯一的辦法通過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