package com.github.marschall.threeten.jpa.mssql;
import static java.time.ZoneOffset.UTC;
import static java.util.concurrent.TimeUnit.MINUTES;
import static java.util.concurrent.TimeUnit.SECONDS;
import java.sql.Timestamp;
import java.time.OffsetDateTime;
import java.time.ZoneOffset;
import javax.persistence.AttributeConverter;
import javax.persistence.Converter;
import microsoft.sql.DateTimeOffset;
/**
* Converts {@link DateTimeOffset} to {@link OffsetDateTime} and back.
*/
@Converter(autoApply = true)
public class MssqlOffsetDateTimeConverter implements AttributeConverter<OffsetDateTime, DateTimeOffset> {
@Override
public DateTimeOffset convertToDatabaseColumn(OffsetDateTime attribute) {
if (attribute == null) {
return null;
}
Timestamp timestamp = Timestamp.from(attribute.toInstant());
int offsetSeconds = attribute.getOffset().getTotalSeconds();
return DateTimeOffset.valueOf(timestamp, Math.toIntExact(SECONDS.toMinutes(offsetSeconds)));
}
@Override
public OffsetDateTime convertToEntityAttribute(DateTimeOffset dbData) {
if (dbData == null) {
return null;
}
OffsetDateTime utc = OffsetDateTime.ofInstant(dbData.getTimestamp().toInstant(), UTC);
int offsetSeconds = Math.toIntExact(MINUTES.toSeconds(dbData.getMinutesOffset()));
ZoneOffset offset = ZoneOffset.ofTotalSeconds(offsetSeconds);
return utc.withOffsetSameInstant(offset);
}
}