001package de.bytefish.pgbulkinsert.pgsql.handlers;
002
003import de.bytefish.pgbulkinsert.pgsql.converter.IValueConverter;
004import de.bytefish.pgbulkinsert.pgsql.converter.LocalDateTimeConverter;
005
006import java.io.DataOutputStream;
007import java.time.LocalDateTime;
008import java.time.ZoneOffset;
009import java.time.ZonedDateTime;
010
011public class ZonedDateTimeValueHandler extends BaseValueHandler<ZonedDateTime> {
012    private IValueConverter<ZonedDateTime, Long> dateTimeConverter;
013
014    public ZonedDateTimeValueHandler() {
015        this(new ToUTCStripTimezone());
016    }
017
018    public ZonedDateTimeValueHandler(IValueConverter<ZonedDateTime, Long> dateTimeConverter) {
019        this.dateTimeConverter = dateTimeConverter;
020    }
021
022    @Override
023    protected void internalHandle(DataOutputStream buffer, ZonedDateTime value) throws Exception {
024        buffer.writeInt(8);
025        buffer.writeLong(dateTimeConverter.convert(value));
026    }
027
028    @Override
029    public int getLength(ZonedDateTime value) {
030        return 8;
031    }
032
033    private static final class ToUTCStripTimezone implements IValueConverter<ZonedDateTime, Long> {
034        private final IValueConverter<LocalDateTime, Long> converter = new LocalDateTimeConverter();
035
036        @Override
037        public Long convert(final ZonedDateTime value) {
038            return converter.convert(value.withZoneSameInstant(ZoneOffset.UTC).toLocalDateTime());
039        }
040    }
041}