DateTimeFormatter parsing line with optional time part fails if space is deleted

Following my other question on how to parse date-only strings, such as LocalDateTime , when I try to parse string 20120301122133 using the yyyyMMdd [HHmmss] pattern, I get an error. It is strange that parsing 20120301 122133 using the yyyyMMdd [HHmmss] template works fine.

So this code works great

LocalDateTime.parse(
     "19940513 230000", 
     new DateTimeFormatterBuilder()
        .appendPattern("yyyyMMdd[ HHmmss]")
        .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
        .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)   
        .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
        .toFormatter()
)

And this one fails

LocalDateTime.parse(
    "19940513230000", 
    new DateTimeFormatterBuilder()
        .appendPattern("yyyyMMdd[HHmmss]")
        .parseDefaulting(ChronoField.HOUR_OF_DAY, 0) 
        .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)         
        .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
        .toFormatter()
)

How can I parse strings in yyyyMMdd [HHmmss] format, that is, in yyyyMMddHHmmss format with extra time using the java 8 API?

, , . , . String DateTimeFormatterBuilder.

+4
3
    System.out.println(LocalDateTime.parse(
            "19940513230000",
            new DateTimeFormatterBuilder()
                .appendPattern("[uuuuMMddHHmmss][uuuuMMdd]")
                .parseDefaulting(ChronoField.HOUR_OF_DAY, 0) 
                .parseDefaulting(ChronoField.MINUTE_OF_HOUR, 0)         
                .parseDefaulting(ChronoField.SECOND_OF_MINUTE, 0)
                .toFormatter()
        ));

:

1994-05-13T23: 00

, "19940513",

1994-05-13T00: 00

yyyy uuuu. , ( 1 ), , . uuuu , 0 1 BCE, -1 2 BCE ..

+1

, "yyyy" , 4 ( , ). :

LocalDateTime ldt =
    LocalDateTime.parse(
        "19940513230000",
        new DateTimeFormatterBuilder()
            .appendValue(ChronoField.YEAR, 4)
            .appendPattern("MMdd[HHmmss]")
            .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
            .toFormatter());
System.out.println(ldt); // 1994-05-13T23:00
+1

, , 19 .

( ) toString():

new DateTimeFormatterBuilder()
        .appendPattern("yyyyMMdd[ HHmmss]")
        .parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
        .toFormatter()
        .toString();

:

< > < → (YearOfEra, 4,19, EXCEEDS_PAD) (MonthOfYear, 2) (DayOfMonth, 2) ['' (HourOfDay, 2) (MinuteOfHour, 2) ( SecondOfMinute, 2)] java.time.format.DateTimeFormatterBuilder$DefaultValueParser@32eff876"

, YearOfEra 4 19.

Meno Ole.

, , (, yyyyMMdd[HHmmSS] [...][...]), ( ).

"" , yyyy 4- .

- ( ):

public static DateTimeFormatter createFixed4DigitYearFormatter(String format) {
    DateTimeFormatterBuilder formatBuilder = new DateTimeFormatterBuilder();
    Arrays.stream(format.split("yyyy", -1))
            .flatMap(cur -> Stream.of("yyyy", cur)).skip(1)
            .filter(str -> !str.isEmpty())
            .forEach(pattern -> {
                if ("yyyy".equals(pattern)) formatBuilder
                        .appendValue(ChronoField.YEAR_OF_ERA, 4);
                else formatBuilder.appendPattern(pattern);
            });
    return formatBuilder.parseDefaulting(ChronoField.HOUR_OF_DAY, 0).toFormatter();
}

"yyyy", "yyyy" ( appendPattern(..)), "yyyy" YEAR_OF_ERA 4 ( appendValue(..)).

, :

System.out.println(LocalDateTime.parse("19940513230000",
        createFixed4DigitYearFormatter("yyyyMMdd[HHmmss]"))); // 1994-05-13T23:00
System.out.println(LocalDateTime.parse("19940513",
        createFixed4DigitYearFormatter("yyyyMMdd[HHmmss]"))); // 1994-05-13T00:00
System.out.println(LocalDateTime.parse("1994-05-13 23:00:00",
        createFixed4DigitYearFormatter("yyyy-MM-dd[ HH:mm:ss]"))); // 1994-05-13T23:00
System.out.println(LocalDateTime.parse("1994-05-13",
        createFixed4DigitYearFormatter("yyyy-MM-dd[ HH:mm:ss]"))); // 1994-05-13T00:00
+1

Source: https://habr.com/ru/post/1695042/


All Articles