본문 바로가기

Java

java.time.format.DateTimeParseException (...could not be parsed: Unable to obtain LocalDate from TemporalAccessor)

년월 데이터를 처리하기 위해 LocalDate를 사용하고 있던중, 문자열을 LocalDate로 변환할 일이 있어 별 생각 없이 LocalDate.parse(문자열, DateTimeFormatter)함수를 사용했다.

String yearMonthString = "202210";
LocalDate yearMonth = LocalDate.parse(yearMonthString, DateTimeFormatter.ofPattern("yyyyMM"));

결과...

java.time.format.DateTimeParseException: Text '202210' could not be parsed: Unable to obtain LocalDate from TemporalAccessor: {Year=2022, MonthOfYear=10},ISO of type java.time.format.Parsed

	at java.base/java.time.format.DateTimeFormatter.createError(DateTimeFormatter.java:2023)
	at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1958)
	at java.base/java.time.LocalDate.parse(LocalDate.java:430)
	at jhproject.datascraper.population.scraper.PopulationScrapYearMonth.of(PopulationScrapYearMonth.java:21)
	at jhproject.datascraper.population.scraper.PopulationScrapParameter.next(PopulationScrapParameter.java:48)
	at jhproject.datascraper.population.scraper.PopulationScrapParameterTest.whenLastLvAndLastRegSeCd_returnNextMonthFirstLvFirstRegSeCd(PopulationScrapParameterTest.java:233)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	...
Caused by: java.time.DateTimeException: Unable to obtain LocalDate from TemporalAccessor: {Year=2022, MonthOfYear=10},ISO of type java.time.format.Parsed
	at java.base/java.time.LocalDate.from(LocalDate.java:398)
	at java.base/java.time.format.Parsed.query(Parsed.java:241)
	at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1954)
	... 74 more

 

원인은, LocalDate를 생성하려면 년, 월, 일 데이터가 필수 데이터 인데 매개변수의 문자열에는 일(day) 데이터가 없기 때문에 발생한 문제이다.

따라서, 간단히 아래처럼 일 데이터를 고정하는 방법으로 수정해서 해결했음

String yearMonthString = "202210";
LocalDate yearMonth = LocalDate.parse(yearMonthString + "01", DateTimeFormatter.ofPattern("yyyyMMdd"));

 

 

반응형