私の問題は次のとおりです。私はファイルを読んでいて、それには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;
}
入力は、このようなものになります。上記のようにロケールを含めるかwithLocale(Locale.ENGLISH)
を使用する場合は
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
を、それが最初の行の日付で失敗文字列。例外は次のとおりです。
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'を明示的に指定しないと、JVMの現在のデフォルトロケールが暗黙的に適用されます。したがって、あなたのJVMの現在のデフォルトスウェーデンロケールがあなたのために適用されたため、 'okt'は正常に解析されました。 –
ええ、問題は私がロケールを提供していたのですが、それは小文字の月を承認しませんでした。したがって、大文字から3月への変換。 –
いいえ、本当に問題は、(a)月の名前の不適切な英語、および(b)日付値の形式の貧弱な選択のために使用される受信日付です。回避策として、不適切な英語に対応するために大文字と小文字を区別しないパーサを作成する方法については、[my answer](http://stackoverflow.com/a/39213129/642706)を参照してください。また、ソースデータのプログラマーに[ISO 8601](https://en.wikipedia.org/wiki/ISO_8601)を教えてください。上記の私のコメントは、あなたの 'Locale'の削除がなぜスウェーデンのテキストで成功したのかを説明することでした。暗黙のスウェーデン語の 'Locale'は小文字の月名を、英語は初期値を期待しています。 –