import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.format.SignStyle;

import static java.time.temporal.ChronoField.*;

public class JI9061980 {
    public static void main(String[] args) {
        DateTimeFormatter strictDateTimeFormatter = new DateTimeFormatterBuilder()
                .parseStrict()
                .parseCaseSensitive()
                .appendValue(YEAR, 4, 10, SignStyle.EXCEEDS_PAD)
                .appendLiteral('-')
                .appendValue(MONTH_OF_YEAR, 2)
                .appendLiteral('-')
                .appendValue(DAY_OF_MONTH, 2)

                .appendLiteral('T')

                .appendValue(HOUR_OF_DAY, 2)
                .appendLiteral(':')
                .appendValue(MINUTE_OF_HOUR, 2)
                .appendLiteral(':')
                .appendValue(SECOND_OF_MINUTE, 2)
                .appendFraction(MILLI_OF_SECOND, 3, 3, true)
                .appendOffsetId()
                .optionalStart()
                .appendLiteral('[')
                .parseCaseSensitive()
                .appendZoneRegionId()
                .appendLiteral(']')
                .toFormatter();

        //System.out.println(strictDateTimeFormatter.parse("2017-12-01T14:12:45.1+01:00[Europe/Prague]")) ;
        System.out.println(strictDateTimeFormatter.parse("2017-12-01T14:12:45.12+01:00[Europe/Prague]"));
        System.out.println(strictDateTimeFormatter.parse("2017-12-01T14:12:45.123+01:00[Europe/Prague]"));
        System.out.println(strictDateTimeFormatter.parse("2017-12-01T14:12:45.1234+01:00[Europe/Prague]"));
    }
}
