일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 테스트
- 병렬프로그래밍
- 안드로이드
- kotlin강좌
- mockito
- 스레드
- 회고
- 알게되는
- 디자인패턴
- 코루틴
- android
- 책
- 안드로이드강좌
- Gradle
- theming
- 병럴프로그래밍
- 커스텀상태
- ReactiveProgramming
- 코틀린
- 알고리즘
- 안드로이드스튜디오
- 글또
- g 단위테스트
- Rxjava
- viewmodel
- Coroutine
- k8s
- 자바
- Kotlin
- Compose
- Today
- Total
선생님, 개발을 잘하고 싶어요.
안드로이드에서 ISO 8601를 파싱하는 가장 깔끔한 방법 본문
평소 항상 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들입니다. 어떤 형태의 문자열을 파싱할 수 있는지도 적어놨기 때문에 유용합니다.
'개발 > android 개발' 카테고리의 다른 글
URL 구조와 OkHttp3를 이용한 URL 생성 및 파싱 (0) | 2022.01.16 |
---|---|
[코틀린] 중첩된 Coroutine 에러 처리 (0) | 2021.12.12 |
[Android] DataBinding, Custom View에 two-way binding을 하는 방법 (0) | 2021.09.19 |
[Android] Custom Font 적용 시 OutOfMemory 발생 및 해결 (0) | 2021.08.26 |
[Lifecycle] Activity Lifecycle 각 callback 마다 무슨 작업을 하는 것이 좋을까? (0) | 2021.04.04 |