본문 바로가기
Mobile App/Android

[안드로이드] org.threeten.bp.zone.ZoneRulesException: No time-zone data files registered

by 후추부 2023. 8. 18.

LocalDate Error

 

위 에러는 Android API 26(android 8.0 오레오 버전) 미만 에서 java.time 패키지를 사용할 떄 발생하는 오류다.

안드로이드 버전마다 지원 범위가 다를 수 있으므로, 사용하려는 기기의 안드로이드 버전에 따라 지원 여부를 확인하는 것이 중요하다.

 

https://developer.android.com/reference/java/time/package-summary

 

java.time  |  Android Developers

 

developer.android.com

위 document 를 확인해보면 Added in API level 26 이라고 적혀있다.

즉, API 26 이상부터 java.time 패키지를 이용할 수 있다는 말이다.

 

그렇다면? 26 이전 버전은 못 사용할까? 아니다.

두 가지 방법으로 해결 할 수 있다.

 

1. ThreeTen 의존성 추가

Android Studio 에서 java.time 패키지 안 메서드를 사용하려고 import 를 시도하면, org.threeten.bp 패키지가 import 될 것이다.

왜 java.time 이 아닌, threeten 패키지가 백포팅이 될까?

 

백포팅이 무엇이냐면? 최신버전의 소프트웨어의 일부를 가져와서 동일한 소프트웨어의 이전 버전으로 포팅하는 작업을 일컫는다. 

즉, java.time 을 26 이전 버전에서 사용할 수 없지만, 사용할 수 있게끔 만드는게 백포팅이라고 생각하면 될 것이다.

 

위에서 말한 것처럼 백포팅을 하여 java.time 패키지 내 소스를 이용할 수 있지만, Error 가 발생할 것이다.

왜? threeten 라이브러리를 의존성 추가하지 않았으니까. 당연히 Error 가 날 것이다.

그래서 아래와 같이 의존성 추가를 해주면 정상 동작할 것이다.

 

dependencies {
    implementation 'com.jakewharton.threetenabp:threetenabp:1.3.0'
}

 

2. java.time 패키지를 이용하는 게 아닌, Calendar 를 이용하기

현재 년월일 시간을 가져오기 위해서 java.time 패키지 속 LocalDate 또는 LocalDateTime 를 사용하기 위해서 위와 같이 의존성 추가 해야하는데 그러길 원치 않는다면, Calendar 를 이용하면 된다.

 

import java.util.Calendar

fun main() {
// 현재 년도에 앞자리 두 개 뽑기
	
    val currentYear: StringCalendar = Calendar.getInstance().get(Calendar.YEAR).toString().substring(0, 2)
    println("현재 년도: ${currentYear}23")
}