import java.time.ZoneId;
import java.time.ZoneOffset;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.SignStyle;
import java.time.temporal.ChronoField;
import java.time.temporal.TemporalAccessor;
import java.util.Locale;

public class DateParseBug {
    public static void main(String[] args) {
        final DateTimeFormatter epochSecondFormatter = new DateTimeFormatterBuilder()
                .appendValue(ChronoField.INSTANT_SECONDS, 1, 19, SignStyle.NORMAL)
                .toFormatter(Locale.ROOT)
                .withZone(ZoneId.of("America/New_York"));
        // This is the transition point from DST to Standard time for that year in America/New_York tz
        ZonedDateTime sixAm = ZonedDateTime.of(2020, 11, 1, 6, 0, 0, 0, ZoneId.of("America/New_York"));
        //System.out.println(sixAm);
        TemporalAccessor actual = epochSecondFormatter.parse(epochSecondFormatter.format(sixAm));
        //System.out.println(actual);
        if (actual.getLong(ChronoField.INSTANT_SECONDS) != sixAm.getLong(ChronoField.INSTANT_SECONDS)) {
            System.out.println("Parsed back a wrong value. Expected: [" + sixAm.getLong(ChronoField.INSTANT_SECONDS) +
                    "] Actual: [" + actual.getLong(ChronoField.INSTANT_SECONDS) + "]");
        } else {
            System.out.println("Parsed Correctly");
        }
    }
} 