Skip to content

Parse String datetime with Zone with Java Date

I am trying to parse these dates in java.time and then get a String representation.

2021-12-27T09:15:09.738+02:00
2022-01-11T20:04:21+02:00

I read this similar answer and I have created a method in order to parse the above dates and return a String with the desired format:

public String getDatetimeFromDatetimeWithT(String dateFull) {
    String date = "";
    
    try {
        LocalDateTime ldate = LocalDateTime.parse(dateFull, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ"));
        date = ldate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    } catch (Exception e) {
        System.out.println(dateFull + " not matched 1 " + e);
    }

    try {
        LocalDateTime ldate = LocalDateTime.parse(dateFull, DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssZ"));
        date = ldate.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
    } catch (Exception e) {
       System.out.println(dateFull + " not matched 2" + e);
    }
    
    return date;
}

However, none patterns are matched. What I am missing here?

UPDATE: In both dates I get an exception for the + character.

2021-12-27T09:15:09.738+02:00 not matched 1 java.time.format.DateTimeParseException: Text '2021-12-27T09:15:09.738+02:00' could not be parsed at index 23

2022-01-11T20:04:21+02:00 not matched 2 java.time.format.DateTimeParseException: Text '2022-01-11T20:04:21+02:00' could not be parsed at index 19

Answer

You don’t even need to define a pattern, your examples are ISO formatted and they contain an offset rather than a zone.

That’s why you can use this alternative (if you want to stick to LocalDateTime):

// parse without passing a formatter
OffsetDateTime odtA = OffsetDateTime.parse("2021-12-27T09:15:09.738+02:00");
OffsetDateTime odtB = OffsetDateTime.parse("2022-01-11T20:04:21+02:00");
// extract the LocalDateTimes
LocalDateTime ldtA = odtA.toLocalDateTime();
LocalDateTime ldtB = odtB.toLocalDateTime();
// print them
System.out.println(ldtA);
System.out.println(ldtB);

Result:

2021-12-27T09:15:09.738
2022-01-11T20:04:21

To make your method shorter, write something like this:

public static String getDatetimeFromDatetimeWithT(String dateFull) throws DateTimeParseException {
    return OffsetDateTime.parse(dateFull)
                         .format(DateTimeFormatter.ISO_LOCAL_DATE_TIME);
}

This basically parses the String argument to an OffsetDateTime and formats that OffsetDateTime using only the information a LocalDateTime has.

Result stays the same as posted aboveā€¦