본문 바로가기
에러 핸들링

Unable to obtain ZonedDateTime from TemporalAccessor

by kdohyeon (김대니) 2024. 4. 5.
반응형

문제 상황

  • String 으로 된 날짜 값을 ZonedDateTime 으로 변환하고자 했다.
    • "20240405183955" ==> 2024-04-05 18:39:55

코드

  • ZonedDateTime 에서 제공하는 parse 메소드로 바로 변환하고자 했다.
fun from(datetime: String, formatter: DateTimeFormatter): ZonedDateTime {
	return ZonedDateTime.parse(datetime, formatter)
}

테스트 코드

@Test
@DisplayName("시간과 포매터를 제공하면 ZonedDateTime 으로 변환할 수 있다.")
fun fromTest() {
    // given
    val datetime = "20240405183955"
    val formatter = ZonedDateTimeUtils.yyyyMMddHHmmss
    val expected = ZonedDateTime.of(
        2024, 4, 5, 18,39,55,0,ZoneId.systemDefault()
    )

    // when
    val actual = ZonedDateTimeUtils.from(datetime, formatter)

    // then
    assertEquals(expected, actual)
}

에러 메시지

  • 테스트 코드가 실패하며 아래와 같은 에러 메시지가 나왔다.
java.time.format.DateTimeParseException: 
Text '20240405183955' could not be parsed: 
Unable to obtain ZonedDateTime from TemporalAccessor: 
{},ISO resolved to 2024-04-05 18:39:55 of type java.time.format.Parsed

해결

  • ZonedDateTime 의 경우에는 타임존 데이터가 있어야한다.
  • 따라서 타임존이 없는 String 날짜 데이터는 바로 변환할 수 없다.
  • LocalDateTime 으로 변환하고, 타임존을 직접 넣어주도록 하자.
fun from(datetime: String, formatter: DateTimeFormatter): ZonedDateTime {
	val localDateTime = LocalDateTime.parse(datetime, formatter)
	return ZonedDateTime.of(localDateTime, ZoneId.systemDefault())
}

 

반응형

댓글