web-dev-qa-db-ja.com

Javaの日付形式を使用して月の完全な形式の文字列を解析する方法は?

私はこれを試しました:

DateFormat fmt = new SimpleDateFormat("MMMM dd, yyyy");
Date d = fmt.parse("June 27, 2007");

エラー:

Exception in thread "main" Java.text.ParseException: Unparseable date: "June 27, 2007"

Java docsは、4文字を使用して完全なフォームに一致させる必要があると言います。使用できるのは[〜#〜] mmm [〜#〜 ] "Jun"のような短縮された月で正常に終了しましたが、完全な形式に一致する必要があります。

テキスト:書式設定では、パターン文字の数が4以上の場合、完全な形式が使用されます。それ以外の場合は、使用可能な場合は短い形式または省略形が使用されます。解析では、パターン文字の数に関係なく、両方の形式が受け入れられます。

http://Java.Sun.com/j2se/1.6.0/docs/api/Java/text/SimpleDateFormat.html

49
tommy chheng

おそらく、月の名前が「January」、「February」などではなく、現地語の他の単語であるロケールを使用しているでしょう。

使用したいロケールを指定してみてください、例えばLocale.US

DateFormat fmt = new SimpleDateFormat("MMMM dd, yyyy", Locale.US);
Date d = fmt.parse("June 27,  2007");

また、日付文字列に余分なスペースがありますが、実際にはこれは結果に影響しません。どちらの方法でも機能します。

115
Mark Byers

これを新しいJava 8 API:

DateTimeFormatter formatter = new DateTimeFormatterBuilder().appendPattern("MMMM dd, yyyy").toFormatter();
TemporalAccessor ta = formatter.parse("June 27, 2007");
Instant instant = LocalDate.from(ta).atStartOfDay().atZone(ZoneId.systemDefault()).toInstant();
Date d = Date.from(instant);
assertThat(d.getYear(), is(107));
assertThat(d.getMonth(), is(5));

もう少し冗長ですが、使用されているDateのメソッドは非推奨であることがわかります;-)進むべき時間。

2
gkephorus