package com.fasterxml.jackson.dataformat.avro.jsr310.deser;

import java.time.Instant;
import java.time.OffsetDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.temporal.Temporal;
import java.util.function.BiFunction;

Deserializer for variants of java.time classes (Instant, OffsetDateTime, ZonedDateTime) from an integer value. Deserialized value represents an instant on the global timeline, independent of a particular time zone or calendar, with a precision of one millisecond from the unix epoch, 1 January 1970 00:00:00.000 UTC. Time zone information is lost at serialization. Time zone data types receives time zone from deserialization context. Deserialization from string is not supported.
Type parameters:
  • <T> – The type of a instant class that can be deserialized.
/** * Deserializer for variants of java.time classes (Instant, OffsetDateTime, ZonedDateTime) from an integer value. * * Deserialized value represents an instant on the global timeline, independent of a particular time zone or * calendar, with a precision of one millisecond from the unix epoch, 1 January 1970 00:00:00.000 UTC. * Time zone information is lost at serialization. Time zone data types receives time zone from deserialization context. * * Deserialization from string is not supported. * * @param <T> The type of a instant class that can be deserialized. */
public class AvroInstantDeserializer<T extends Temporal> extends AvroJavaTimeDeserializerBase <T> { private static final long serialVersionUID = 1L; public static final AvroInstantDeserializer<Instant> INSTANT = new AvroInstantDeserializer<>(Instant.class, (instant, zoneID) -> instant); public static final AvroInstantDeserializer<OffsetDateTime> OFFSET_DATE_TIME = new AvroInstantDeserializer<>(OffsetDateTime.class, OffsetDateTime::ofInstant); public static final AvroInstantDeserializer<ZonedDateTime> ZONED_DATE_TIME = new AvroInstantDeserializer<>(ZonedDateTime.class, ZonedDateTime::ofInstant); protected final BiFunction<Instant, ZoneId, T> fromInstant; protected AvroInstantDeserializer(Class<T> supportedType, BiFunction<Instant, ZoneId, T> fromInstant) { super(supportedType); this.fromInstant = fromInstant; } @Override protected T fromLong(long longValue, ZoneId defaultZoneId) { /** * Number of milliseconds, independent of a particular time zone or calendar, * from 1 January 1970 00:00:00.000 UTC. */ return fromInstant.apply(Instant.ofEpochMilli(longValue), defaultZoneId); } }