web-dev-qa-db-ja.com

LocalDateに文字列を解析できません(Java 8)

私の入力は、2015年7月1日の "01-07-2015"形式の日付の文字列表現です。これをJava.time.LocalDate変数に解析しようとしています。

final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("dd-MM-YYYY");
final String input = "01-07-2015";
final LocalDate localDate = LocalDate.parse(input, DATE_FORMAT);

DateTimeFormatter JavaDoc に基づいて、これが機能すると期待しています。しかし、私は非常にフレンドリーで役立つメッセージで迎えられます:

原因:Java.time.DateTimeException:TemporalAccessorからLocalDateを取得できません:{DayOfMonth = 1、MonthOfYear = 7、WeekBasedYear [WeekFields [MONDAY、4]] = 2015}、タイプJava.time.format.ParsedのISO

私はこの例外が私に何を伝えているのか本当に理解していません。誰が間違っているのか説明してもらえますか?

26
mthmulders

年間では、小文字のyを使用する必要があります。

final DateTimeFormatter DATE_FORMAT = DateTimeFormatter.ofPattern("dd-MM-yyyy");

大文字のYは平年に使用されます。詳細については、 DateTimeFormatterのjavadoc を参照してください。

35
Jens

質問に対する答えは、「Y」ではなく「y」を使用することです。

エラーメッセージを説明するには、分解してみましょう。

_Unable to obtain LocalDate from TemporalAccessor_

これは、LocalDate(日付/時刻のフィールドへのハッシュマップのようなアクセスを提供する低レベルのインターフェース)からTemporalAccessor(要求されたもの)を作成できないと言っています。

_of type Java.time.format.Parsed_

これは、メソッドに渡されるオブジェクトが_Java.time.format.Parsed_型であったことを意味しています。これは解析の標準出力タイプであり、解析されたすべての情報が含まれています。

_{DayOfMonth=1, MonthOfYear=7, WeekBasedYear[WeekFields[MONDAY,4]]=2015},ISO_

これは、構文解析の結果である_Java.time.format.Parsed_オブジェクトのtoString()形式です。 4つのことが解析されたと言っています。

  • _DayOfMonth=1_、_1_の値で解析された月の日
  • _MonthOfYear=7_、_7_の値で解析された月
  • _WeekBasedYear[WeekFields[MONDAY,4]]=2015_、値_2015_で解析された週ベースの年
  • ISO、ISOカレンダーシステム(デフォルト値)

DayOfMonth + MonthOfYear + WeekBasedYearの組み合わせからLocalDateを生成することはできないため、例外がスローされます。

_[WeekFields[MONDAY,4]]_の部分は、週を定義するさまざまな方法があり、米国の週は日曜日に始まりますが、ISO規格およびEUでは月曜日に始まるという事実に言及していることに注意してください。

18
JodaStephen