🪐

【Java】Spring Data JPAで日付型のデータへConvertにてタイムゾーンを付与してみる

に公開

概要

PostgreSQLのTIMESTAMPTZ型はPostgreSQL の TIMESTAMPTZ 型はタイムゾーンに関する情報を保持しないの記事にある通り、データとしてはタイムゾーンの情報を保持していません。したがって、Spring Data JPAでTIMESTAMPTZ型のデータを取得する際も、タイムゾーンはUTCになってしまいます。というわけで、データ取得時にConvertを行なって、タイムゾーン情報を付与してみます。

前提

  • 使用したSpingBootのバージョンは3.5.3です。

対応方針

JPA Attribute Convertersの記事で紹介されている通り、Converterを別途作成してこれを適用します。OffsetDateTimeでデータ型を定義して取得時(convertToEntityAttribute)にタイムゾーン情報を付与します。

実装サンプル

OffsetDateTimeのConverterは以下の通りです。

public class OffsetDateTimeConverter
        implements AttributeConverter<OffsetDateTime, OffsetDateTime> {

    @Override
    public OffsetDateTime convertToDatabaseColumn(OffsetDateTime attribute) {
        // 保存時はそのまま
        return attribute;
    }

    @Override
    public OffsetDateTime convertToEntityAttribute(OffsetDateTime dbData) {
        if (dbData == null) return null;

        // 取得時の処理 - 特定のオフセットを適用
        ZoneOffset targetOffset = ZoneOffset.of("+09:00"); // 東京時間
        return dbData.withOffsetSameInstant(targetOffset);
    }
}

これを日付型の列に以下の通り適用します。

@Column(name = "execute_date_time")
@Convert(converter = OffsetDateTimeConverter.class)
private OffsetDateTime executeDateTime;

Discussion