OffsetDateTimeSerializer.java

package tools.jackson.databind.ext.javatime.ser;

import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;

public class OffsetDateTimeSerializer extends InstantSerializerBase<OffsetDateTime>
{
    public static final OffsetDateTimeSerializer INSTANCE = new OffsetDateTimeSerializer();

    protected OffsetDateTimeSerializer() {
        super(OffsetDateTime.class, dt -> dt.toInstant().toEpochMilli(),
                OffsetDateTime::toEpochSecond, OffsetDateTime::getNano,
                DateTimeFormatter.ISO_OFFSET_DATE_TIME);
    }

    protected OffsetDateTimeSerializer(OffsetDateTimeSerializer base,
            Boolean useTimestamp, DateTimeFormatter formatter,
            JsonFormat.Shape shape) {
        this(base, formatter, useTimestamp, base._useNanoseconds, shape);
    }

    protected OffsetDateTimeSerializer(OffsetDateTimeSerializer base,
            DateTimeFormatter formatter,
            Boolean useTimestamp, Boolean useNanoseconds,
            JsonFormat.Shape shape) {
        super(base, formatter, useTimestamp, useNanoseconds, shape);
    }

    /**
     * Method for constructing a new {@code OffsetDateTimeSerializer} with settings
     * of this serializer but with custom {@link DateTimeFormatter} overrides.
     * Commonly used on {@code INSTANCE} like so:
     *<pre>
     *  DateTimeFormatter dtf = new DateTimeFormatterBuilder()
     *          .append(DateTimeFormatter.ISO_LOCAL_DATE)
     *          .appendLiteral('T')
     *          // and so on
     *          .toFormatter();
     *  OffsetDateTimeSerializer ser = OffsetDateTimeSerializer.INSTANCE
     *          .withFormatter(dtf);
     *  // register via Module
     *</pre>
     *
     * @since 2.21 / 3.1
     */
    public OffsetDateTimeSerializer withFormatter(DateTimeFormatter formatter)     {
        return new OffsetDateTimeSerializer(this, _useTimestamp, formatter, _shape);
    }

    @Override
    protected JSR310FormattedSerializerBase<?> withFormat(DateTimeFormatter formatter,
            Boolean useTimestamp,
            JsonFormat.Shape shape)
    {
        return new OffsetDateTimeSerializer(this, useTimestamp, formatter, shape);
    }

    @Override
    protected JSR310FormattedSerializerBase<?> withFeatures(Boolean writeZoneId, Boolean writeNanoseconds) {
        return new OffsetDateTimeSerializer(this, _formatter,
                _useTimestamp, writeNanoseconds, _shape);
    }
}