Home > Enterprise >  parse custom time in java 8
parse custom time in java 8

Time:08-25

I want to create a one utility method that parses custom time strings like: 14h , 17h30.

I tried to use LocalTime.ofPattern() method using various pattern combination but I keep getting a DateTimeParseException

Edit:
I tried the following:
This throws an exception when the time is 14h

LocalTime time = LocalTime.parse("14h", DateTimeFormatter.ofPattern("k'h'm"));

And this also throws an exception for 14h30

LocalTime time = LocalTime.parse("9h30", DateTimeFormatter.ofPattern("k'h'"));

I learned from the comment that I can use the catch block to handle all the patterns but I wonder if there is a java time API that can accept a list of patterns

CodePudding user response:

I would utilize a DateTimeFormatterBuilder here in order to create a flexible DateTimeFormatter that parses a wide variety of input.

Create a List<String> of some possible test values, then loop through them and try to parse each one with that formatter.

Here's an example:

public static void main(String[] args) {
    // prepare some test values (don't know if all of them actually apply to your problem)
    List<String> times = List.of("17h", "17h30", "4h", "4h59", "09h", "09h21");
    // prepare a DateTimeFormatter with optional minutes of hour and a fixed 'h'
    DateTimeFormatter dtf = new DateTimeFormatterBuilder()
                                    .appendPattern("H")
                                    .appendLiteral('h')
                                    .optionalStart()
                                    .appendPattern("m")
                                    .optionalEnd()
                                    .toFormatter(Locale.ENGLISH);
    times.forEach(time -> {
        try {
            // then try to parse each test value
            LocalTime localTime = LocalTime.parse(time, dtf);
            // and print it if no exception was thrown
            System.out.println(localTime.format(DateTimeFormatter.ISO_LOCAL_TIME));
        } catch (DateTimeParseException dtpEx) {
            // in case of an exception, print the value that could not be parsed
            String msg = String.format("Could not parse %s", time);
            System.err.println(msg);
        }
    });
}

Output:

17:00:00
17:30:00
04:00:00
04:59:00
09:00:00
09:21:00

Please note: I used the symbol H for hour of day, but if your possible values really use k for clock-hour of day, then simply replace the H for k. The edge cases would be 00h and 24h. Consider involving them in your test cases ;-)

More information about the symbols can be found in
the JavaDocs of java.time.format.DateTimeFormatter

  • Related