From 1379e18f0fc5e125fef994556e30a4356a08ba82 Mon Sep 17 00:00:00 2001 From: Kai Moritz Date: Tue, 22 Dec 2015 00:14:34 +0100 Subject: [PATCH] Implemented a OffsetTime-to-GregorianCalendar converter --- .../jpa/converters/OffsetTimeConverter.java | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 src/main/java/de/juplo/jpa/converters/OffsetTimeConverter.java diff --git a/src/main/java/de/juplo/jpa/converters/OffsetTimeConverter.java b/src/main/java/de/juplo/jpa/converters/OffsetTimeConverter.java new file mode 100644 index 0000000..4543950 --- /dev/null +++ b/src/main/java/de/juplo/jpa/converters/OffsetTimeConverter.java @@ -0,0 +1,43 @@ +package de.juplo.jpa.converters; + +import java.time.Instant; +import java.time.LocalDate; +import java.time.OffsetTime; +import java.time.ZoneOffset; +import java.time.ZonedDateTime; +import java.util.GregorianCalendar; +import javax.persistence.AttributeConverter; +import javax.persistence.Converter; + + +/** + * Converts an {@link OffsetTime} to a {@link GregorianCalendar}, by converting + * it into a {@ZonedDateTime} at the date of {@link Instant.EPOCH} and + * then convering that {@link ZonedDateTime} into a {@link GregorianCalendar} + * as suggested in the official Java 8 Time tutorial. + *

+ * The {@link GregorianCalendar} can then be persisted as + * {@link java.persistene.TemporalType.TIME} with the help of the + * {@link java.persist.Tmporal}-annotation. + * @see https://docs.oracle.com/javase/tutorial/datetime/iso/legacy.html + * @author Kai Moritz + */ +@Converter(autoApply = true) +public class OffsetTimeConverter implements AttributeConverter +{ + private final static LocalDate EPOCH = LocalDate.from(Instant.EPOCH); + + + @Override + public GregorianCalendar convertToDatabaseColumn(OffsetTime ot) + { + ZoneOffset offset = ot.getOffset(); + return GregorianCalendar.from(ZonedDateTime.of(EPOCH, ot.toLocalTime(), offset)); + } + + @Override + public OffsetTime convertToEntityAttribute(GregorianCalendar calendar) + { + return OffsetTime.from(calendar.toInstant()); + } +} -- 2.20.1