선생님, 개발을 잘하고 싶어요.

안드로이드에서 ISO 8601를 파싱하는 가장 깔끔한 방법 본문

개발/android 개발

안드로이드에서 ISO 8601를 파싱하는 가장 깔끔한 방법

알고싶은 승민 2021. 9. 24. 08:00

평소 항상 Date클래스와 Calendar클래스를 쓰며 파싱이라곤 SimpleDateFormat을 사용해서 동작은 하게 코드를 짜고있었는데요.

사람이 살다보니 좀더 포멀하게 코드를 짜야할 상황을 마주하게 되고 이 참에 이 불편한 코드를 개선해보자고 생각해서 찾아봤습니다.

 

뭐 이런 문자열을 파싱하고 싶은겁니다. 

  • 2017-05-06T00:36:45+09:00
  • 2017-06-21T15:59:30.000+09:00

ISO 8601이라고 하는데요. 여기에 시간 Offset까지 포함된 친구입니다. 

실행 코드

다음을 build.gradle에 추가하세요.

android {
    defaultConfig {
        // minSdkVersion가 20 이하일 때만 적용하세요.
        multiDexEnabled true
    }

    compileOptions {
        // Java8+API desugaring support를 사용하도록 합니다.
        coreLibraryDesugaringEnabled true
        // Sets Java compatibility to Java 8
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
}

다음 코드가 실행되면 offset을 해석해서 Unix Timestamp를 반환하게 됩니다.

object ISO8601Utils {
    fun fromString(date: String): Long {
    	// 제가 검색하고자 하는 ISO_OFFSET_DATE_TIME 이 Offset을 포함하므로 
        //   OffsetDateTime을 호출했습니다.
        // 생각보다 많은 XXXDateTime 클래스가 이 함수를 가지고 있고,
        //  Predefined Formatters 마다 적합한 클래스를 골라써야 합니다.
        val parsedDate = OffsetDateTime.parse(date, DateTimeFormatter.ISO_OFFSET_DATE_TIME)
        return parsedDate.toInstant().toEpochMilli()
    }
}

 

참고 자료 및 첨언

DateTimeFormatter를 써야하는데 Android에서 이 기능은 API 26+에서만 지원합니다. 이거 사용하려고 minSdk를 올리는 건 말도 안되고, Gradle4.0+ 부터 지원하는 JavaDesugaring의 사용을 고려할만 합니다. Java 8+API desugaring support

 

Joda-Time: 몰랐는데 java.time이 등장하기 전 부터 존재한 고대의 라이브러리입니다. 시간을 처리하는 라이브러리 치고 깔끔해서 좋다고 합니다. (하지만 바이너리가 크고, Java8+에서 공식 지원하는 라이브러리가 있는데 굳이 쓰는 것을 추천하지 않는다고...)

ThreeTenABP: JakeWharton 형님의 JodaTime 경량화 라이브러리입니다. 이게 Java8+에서 지원하지만 안드로이드는 지원을 안하기 때문에 만들었다고 합니다. 하지만 Wharton 형님의 조언으로는 공식 라이브러리를 사용하는 것을 추천한다고 합니다.

 

Predefined Formatters: 안드로이드에서 쓸수 있는 사전에 정의된 DateTimeFormatter들입니다. 어떤 형태의 문자열을 파싱할 수 있는지도 적어놨기 때문에 유용합니다.

 

Comments