I am trying to get data about some athletes from a csv file, then create athlete objects that are going to be stored in a list. The problem is that I get an error when I try to parse the time they’ve got as LocalDateTime.This is the error I get:
Exception in thread “main” java.time.format.DateTimeParseException: Text ’30:27′ could not be parsed: Unable to obtain LocalDateTime from TemporalAccessor: {MinuteOfHour=30, MicroOfSecond=0, MilliOfSecond=0, SecondOfMinute=27, NanoOfSecond=0},ISO of type java.time.format.Parsed
This is the code:
public static void addAthletes() { try (BufferedReader br = new BufferedReader( new FileReader("C:\Users\****\******\**********\src\main\java\ro\sci\tema10_ski_biathlon_standings\standings.csv"))) { String line = null; while ((line = br.readLine()) != null) { athleteList.add(getAthleteFromCsvLine(line)); } } catch (IOException e) { e.printStackTrace(); } } private static Athlete getAthleteFromCsvLine(String line) { String[] athleteAttributes = line.split(","); if (athleteAttributes.length != 7) { throw new IllegalArgumentException(); } int athleteNumber = Integer.parseInt(athleteAttributes[0].trim()); LocalDateTime skiTimeResults = LocalDateTime.parse(athleteAttributes[3].trim(), DateTimeFormatter.ofPattern("mm:ss")); return new Athlete( athleteNumber, athleteAttributes[1], athleteAttributes[2], skiTimeResults, athleteAttributes[4], athleteAttributes[5], athleteAttributes[6] ); }
Please help me overcome this
Advertisement
Answer
Well, LocalDateTime
expects a date component to be present, and a valid time component. Your 30:27
text contains neither: obviously, 30:27
as a wall clock time does not exist.
It seems you are looking for a duration here. Use Duration
. Note that Duration
does not have a method to parse the text 30:27
successfully, so we have to convert it to a ISO period/duration string:
String[] components = athleteAttributes[3].trim().split(":"); String durationStr = String.format("PT%sM%sS", components[0], components[1]); Duration duration = Duration.parse(durationStr);
Alternatively, you could use
String[] components = athleteAttributes[3].trim().split(":"); int minutes = Integer.parseInt(components[0]); int seconds = Integer.parseInt(components[1]); Duration duration = Duration.ofMinutes(minutes).plusSeconds(seconds);