LoginSignup
3
3

More than 5 years have passed since last update.

Java8の日付APIを使って年齢計算したら、UnsupportedOperationExceptionが発生して嵌ったお話

Posted at

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気持ちいいですね。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3