🪐
【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