2016-07-11 2 views
8

とDateTimeFormatterBuilder私は、次のフォーマッタがありますYEARフィールドに指定したparseDefaulting競合

DateTimeFormatter formatter = new DateTimeFormatterBuilder() 
     .appendPattern("yyyyMM") 
     .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0) 
     .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0) 
     .parseDefaulting(ChronoField.HOUR_OF_DAY, 0) 
     .parseDefaulting(ChronoField.DAY_OF_MONTH, 1) 
     .parseDefaulting(ChronoField.MONTH_OF_YEAR, 1) 
     .parseDefaulting(ChronoField.YEAR, ZonedDateTime.now().getYear()) 
     .toFormatter() 
     .withZone(ZoneId.systemDefault()); 

を、私は文字列を解析しようとする "201505"

System.out.println(ZonedDateTime.parse("201505", formatter)); 

、それが例外をスロー:

原因:java.time.DateTimeException:競合が検出されました:2016年 が2015と異なる

YEARのデフォルト値の設定をコメントアウトすると機能します。

ドキュメントを理解している限り、値が解析されない場合は、デフォルト値を置き換えるようにしてください。私はデフォルトのものとは別の月があるので、これは月のように動作するようです。しかし、それは一年の間働かない。

パターンに存在しない可能性のあるフィールドのデフォルト値を定義する別の方法があるかどうかは間違っていますか?

+2

「yyyyMM」という形式の入力を「YearMonth」ではなく「ZonedDateTime」に解析する理由を教えてください。 –

+0

私は、異なるフォーマットを解析するコードを持っています。フォーマッタが受け取る40-50の異なるパターンがあります。私は、常にZonedDateTimeという結果になる構文解析に、一般的なフォーマッタを使用したかったのです。それは私が持っている場合の一つです。 –

+0

本当に40-50パターン?異なるロケールもありますか?パフォーマンスはどうですか?内部例外のスロー/キャッチのために悪いことが必要です。あなたのスピード体験を報告してもらえますか? –

答えて

8

パターン文字「y」は、ChronoField.YEARではなく、ChronoField.YEAR_OF_ERAを指しているという問題があります。最後のparseDefaulting行を変更するだけで、

.parseDefaulting(ChronoField.YEAR_OF_ERA, ZonedDateTime.now().getYear()) 

となります。

+3

はい、ありがとう! –

関連する問題