1. コンテキスト/状況/背景
データベースから取得した誕生日から、Java8で導入された日付APIを用いて年齢計算をしようとすると、UnsupportedOperationExceptionがスローされます
java.util.DateからLocalDateへ変換しようとすると、UnsupportedOperationExceptionが発生
java
Instant instant = birthday.toInstant(); // UnsupportedOperationExceptionが発生
LocalDateTime dateTime = LocalDateTime.ofInstant(instant, ZoneOffset.systemDefault());
ぐぬぬと、2時間ぐらいスタバで唸っていました。
java.util.Dateのjavadocには何も書いていない。ぐぐっても出てこない。。。。。
しかし、java.sql.Dateのjavadocには、以下の記載があります。
toInstant()
このメソッドは常にUnsupportedOperationExceptionをスローします。SQL Date値は時間コンポーネン>トを持たないので、このメソッドは使わないでください。
納得感がないですが、時間コンポーネントがないのが犯人のようです。
2. コード
ちょっと残念なのですが、以下のように文字列型に変換して日付計算するのが素直です。
java
private Integer getAge(Date birthday){
LocalDate today = LocalDate.now();
return Period.between(LocalDate.parse(birthday.toString()), today).getYears();
}
嵌ってはしまったのですが、簡潔に書けるのでJava8気持ちいいですね。