我的問題如下。我正在閱讀一個文件,它包含一堆CSV行。每行包含格式爲22-mar-2010
或類似格式的某日期,即格式爲dd-MMM-yyyy
。我想將其轉換爲ISO格式,因此它變成2010-03-22
。Java英文日期格式解析
我的代碼看起來是這樣的:
private String convertDate(String date) {
DateTimeFormatter oldFormat = DateTimeFormatter.ofPattern("dd-MMM-yyyy", new Locale("en"));
LocalDate parsedDate = LocalDate.parse(date, oldFormat);
DateTimeFormatter newFormat = DateTimeFormatter.ISO_DATE;
String newDate = parsedDate.format(newFormat);
return newDate;
}
輸入看起來是這樣的:
sdfdsfslk 28-mar-2007 dfdsljs
sdfdsfslk 20-apr-2014 dfdsljs
sdfdsfslk 13-oct-2005 dfdsljs
sdfdsfslk 20-may-2014 dfdsljs
sdfdsfslk 20-jan-2014 dfdsljs
sdfdsfslk 20-feb-2014 dfdsljs
如果包括區域如上或使用withLocale(Locale.ENGLISH)
則未能在第一行日期串。唯一的例外是:
java.time.format.DateTimeParseException: Text '28-mar-2007' could not be parsed at index 3
如果我刪除區域部分,只是有:
DateTimeFormatter.ofPattern("dd-MMM-yyyy");
然後它,直到它遇到這樣一個日期13-oct-2005
。它不喜歡英文'oct',並且在LocalDate.parse
行失敗。如果我將oct轉換爲okt(瑞典語,我在哪裏),那麼它會解析它。
我需要完全更改我的語言環境嗎?或者在這裏出了什麼問題?即使我在瑞典,我怎樣才能用英文解析日期呢?
總是涉及'Locale'。如果您沒有明確指定'Locale',那麼隱式應用您的JVM的當前默認語言環境。因此'okt'已成功解析,因爲您的JVM的當前默認瑞典語區域設置是以您的名義應用的。 –
是的,但問題是我提供了一個語言環境,但沒有批准小寫月份。因此,轉換爲大寫到3月 –
不,實際上問題是使用的傳入日期(a)本月名稱的英文不當,&(b)日期值的格式選擇不當。作爲解決方法,請參閱[我的答案](http://stackoverflow.com/a/39213129/642706),以製作不區分大小寫的解析器來適應不正確的英語。並教育程序員關於[ISO 8601]的源數據(https://en.wikipedia.org/wiki/ISO_8601)。我上面的評論是爲了解釋爲什麼你刪除'Locale'然後用瑞典語文本成功。隱含的瑞典語「Locale」期望小寫月份名稱,而英語期望初始上限。 –