Search code examples
javadatetime-formatdatetimeoffsetdatetime-parsingdatetimeformatter

More beautiful Multiple DateTimeFormatter?


I got multiple string date to convert to OffsetDateTime and I did that with multiple try and catch, I think I will not have other DateTimeFormatter to write. So, how to make that more beautiful ?

code:

public static OffsetDateTime convertStringDateToOffsetDate(String dateStr){
        DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX").withLocale( Locale.US );
        DateTimeFormatter f2 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss").withZone(ZoneId.of("Europe/Paris"));
        DateTimeFormatter f3 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssXXX").withZone(ZoneId.of("Europe/Paris"));
        DateTimeFormatter f4 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSS").withZone(ZoneId.of("Europe/Paris"));
        DateTimeFormatter f5 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS").withZone(ZoneId.of("Europe/Paris"));
        DateTimeFormatter f6 = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSSSSXXX").withZone(ZoneId.of("Europe/Paris"));
        OffsetDateTime myDate = null;
        try{
            myDate = ZonedDateTime.parse(dateStr, f).toOffsetDateTime();
        } catch(DateTimeParseException e){
            try{
                myDate = ZonedDateTime.parse(dateStr, f2).toOffsetDateTime();
            } catch (DateTimeParseException ex) {
                try{
                    myDate = ZonedDateTime.parse(dateStr, f3).toOffsetDateTime();
                } catch (DateTimeParseException exc) {
                    try{
                        myDate = ZonedDateTime.parse(dateStr, f4).toOffsetDateTime();
                    }  catch (DateTimeParseException exce) {
                        try{
                            myDate = ZonedDateTime.parse(dateStr, f5).toOffsetDateTime();
                        } catch(DateTimeParseException excep){
                            myDate = ZonedDateTime.parse(dateStr, f6).toOffsetDateTime();
                        }
                    }
                }
            }
        }

        return myDate;
    }

Solution

  • public static OffsetDateTime convertStringDateToOffsetDate(String dateStr){
        DateTimeFormatter f = DateTimeFormatter.ofPattern("yyyy-MM-dd['T'][ ][HH:mm:ss][.][SSSSSS][SSSSS][SSSS][SSS][XXX][XX][X]").withZone(ZoneId.of("Europe/Paris"));
        return ZonedDateTime.parse(dateStr, f).toOffsetDateTime();
    }
    

    This should handle all your patterns. No multiple formatters or regex is needed.