class ObjectReaderImplZonedDateTime
        extends DateTimeCodec implements ObjectReader {
    static final ObjectReaderImplZonedDateTime INSTANCE = new ObjectReaderImplZonedDateTime(null, null);

    public static ObjectReaderImplZonedDateTime of(String format, Locale locale) {
        if (format == null) {
            return INSTANCE;
        }

        return new ObjectReaderImplZonedDateTime(format, locale);
    }

    private Function builder;

    public ObjectReaderImplZonedDateTime(Function builder) {
        super(null, null);
        this.builder = builder;
    }

    public ObjectReaderImplZonedDateTime(String format, Locale locale) {
        super(format, locale);
    }

    @Override
    public Class getObjectClass() {
        return ZonedDateTime.class;
    }

    @Override
    public Object readJSONBObject(JSONReader jsonReader, Type fieldType, Object fieldName, long features) {
        return jsonReader.readZonedDateTime();
    }

    @Override
    public Object readObject(JSONReader jsonReader, Type fieldType, Object fieldName, long features) {<FILL_FUNCTION_BODY>}
}

        JSONReader.Context context = jsonReader.getContext();

        ZonedDateTime zdt;
        if (jsonReader.isInt()) {
            long millis = jsonReader.readInt64Value();
            if (formatUnixTime) {
                millis *= 1000;
            }

            Instant instant = Instant.ofEpochMilli(millis);
            zdt = ZonedDateTime.ofInstant(instant, context.getZoneId());
        } else {
            if (jsonReader.readIfNull()) {
                zdt = null;
            } else if (format == null || yyyyMMddhhmmss19 || formatISO8601) {
                zdt = jsonReader.readZonedDateTime();
            } else {
                String str = jsonReader.readString();
                if (formatMillis || formatUnixTime) {
                    long millis = Long.parseLong(str);
                    if (formatUnixTime) {
                        millis *= 1000L;
                    }
                    Instant instant = Instant.ofEpochMilli(millis);
                    zdt = ZonedDateTime.ofInstant(instant, context.getZoneId());
                } else {
                    DateTimeFormatter formatter = getDateFormatter(jsonReader.getLocale());
                    if (!formatHasHour) {
                        zdt = ZonedDateTime.of(
                                LocalDate.parse(str, formatter),
                                LocalTime.MIN,
                                context.getZoneId()
                        );
                    } else {
                        if (!formatHasDay) {
                            zdt = ZonedDateTime.of(
                                    LocalDate.of(1970, 1, 1),
                                    LocalTime.parse(str, formatter),
                                    context.getZoneId()
                            );
                        } else {
                            LocalDateTime localDateTime = LocalDateTime.parse(str, formatter);
                            zdt = ZonedDateTime.of(localDateTime, context.getZoneId());
                        }
                    }
                }
            }
        }

        if (builder != null && zdt != null) {
            return builder.apply(zdt);
        }

        return zdt;
    
<methods>public void <init>(java.lang.String) ,public void <init>(java.lang.String, java.util.Locale) ,public java.time.format.DateTimeFormatter getDateFormatter() ,public java.time.format.DateTimeFormatter getDateFormatter(java.util.Locale) <variables>java.time.format.DateTimeFormatter dateFormatter,public final non-sealed java.lang.String format,protected final non-sealed boolean formatHasDay,protected final non-sealed boolean formatHasHour,public final non-sealed boolean formatISO8601,public final non-sealed boolean formatMillis,public final non-sealed boolean formatUnixTime,public final non-sealed java.util.Locale locale,protected final non-sealed boolean useSimpleDateFormat,public final non-sealed boolean useSimpleFormatter,protected final non-sealed boolean yyyyMMdd10,protected final non-sealed boolean yyyyMMdd8,protected final non-sealed boolean yyyyMMddhhmm16,protected final non-sealed boolean yyyyMMddhhmmss14,protected final non-sealed boolean yyyyMMddhhmmss19