기존에 날짜/시간을 변환하고 표시하기 위해, calendar, Date, SimpleDateFormat 등을 사용했습니다.
그런데, 그동안 위의 클래스에 불편함이 문제가 좀 많이 있었습니다.
(문제점은 옆에 링크 확인 : https://d2.naver.com/helloworld/645609)
이를 개선하고자 Java8 에 적용된 것이 LocalDate, LocalDateTime입니다.
어떻게 사용하면 되는지 쉽게 빠르게 알아보겠습니다.
* LocalDate, LocalDateTime 클래스는 Android 버전 코드 오레오(Build.VERSION_CODES.O) / API level 26 이상부터 지원이 됩니다.
당연히 우리의 어플은 minSdk가 26 미만일 것입니다.
그래서, 하위 버전에서도 위의 클래스를 지원하도록 해주어야 합니다.
build.gradle (모듈 수준) 파일의 각항목에 아래 내용을 추가합니다.
android {
...
compileOptions {
coreLibraryDesugaringEnabled true // LocalDateTime 이 Api 26 이하 지원을 위해서 추가함.
...
}
...
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.5'
...
}
"Sync now" 를 해주시면 이제 사용 준비가 완료되었습니다.
1. 현재 시간을 milliseconds로 가져오기
// 현재 시간 milliseconds
// val currentMillis = System.currentTimeMillis()
// LocalDateTime 을 이용하여 현재시간 milliseconds 가져오기
val currentMillis = LocalDateTime.now()
.atZone(ZoneId.systemDefault())
.toInstant()?.toEpochMilli() ?: 0
맨위에 System.currentTimeMillis() 를 호출해서 가져올수도 있고, 아래와 같이 가져올수도 있습니다.
위의 currentTimeMillis()가 훨~씬 간단한데 아래와 같이 사용할 필요는 없겠죠. (예시를 보여드린 거예요.)
코드를 보면 now()는 현재시간이고, atZone는 타임존(systemDefault()이니까 단말에 설정된 시간인것 같고..), toEpochMillis()는 함수 이름을 보기에도 milliseconds 를 반환하는 것이라는 것을 어느정도 알수 있습니다.
여기서 중요한 함수는 toEpochMillis()입니다. 어떤 기준으로 milliseconds를 반환하는지 여부입니다.
해당 함수를 보니.. 위와 같이 주석 내용이 있습니다.
(영어가 짧은 관계로 번역기를 돌려보겠습니다.)
예상했던대로 1970년 1월 1일 0시 기준이네요.
이 순간을 1970-01-01T00:00:00Z 시대의 밀리초 수로 변환합니다. 이 순간이 타임라인의 한 지점을 너무 먼 미래나 과거로 표시하여 긴 밀리초에 맞지 않으면 예외가 발생합니다. 이 순간의 정밀도가 밀리초보다 크면 나노초 단위의 양을 100만 단위로 정수 나눗셈한 것처럼 변환 시 초과 정밀도 정보가 삭제됩니다. 보고: 1970-01-01T00:00:00Z 시대 이후의 밀리초 수
2. milliseconds -> LocalDateTime 으로 변환
val currentDateTime =
Instant.ofEpochMilli(currentMillis).atZone(ZoneId.systemDefault()).toLocalDateTime()
1번과 반대로 milliseconds를 LocalDateTime으로 변환하는 코드입니다.
3. LocalDateTime을 년월일시분초로 표시하기
DateTimeFormatter.ofPattern("yyyy년 MM월 dd일 HH시 mm분 ss초").format(currentDateTime)
기존에 사용했던 SimpleDateFormat 과 유사하게 년월일시분초(yyyyMMdd HHmmss) 패턴으로 표시하게 됩니다.
4. 특정 날짜 -> LocalDate 로 변환
val localDate = LocalDate.parse("2023-11-06", DateTimeFormatter.ofPattern("yyyy-MM-dd"))
입력하는 특정 날짜의 format 패턴을 지정하여, LocalDate로 변환합니다.
(특정 날짜시간도 마찬가지로 format 패턴을 지정하여, LocalDateTime으로 변환하면 됩니다.)
5. 특정 날짜 -> milliseconds 로 변환
val localDateMillis =
localDate.atStartOfDay(ZoneId.systemDefault()).toInstant()?.toEpochMilli() ?: 0
위의 1번과 비슷한 코드인데, atStartOfDay()라는 함수가 들어갑니다.
이는 함수 이름에서도 알수있듯이, 해당 날짜의 가장 빠른 시간(0시 0분 0초)를 설정하게됩니다.
이를 이용하여 millseconds의 시분초를 0으로 셋팅할 수 있습니다.
6. 특정 날짜 ISO 포멧 표시
DateTimeFormatter.ISO_INSTANT.format(
Instant.ofEpochMilli(localDateMillis)
)
위와같이 LocalDate, LocalDateTime 사용 방법에 대해 알아보았습니다.
물론 이외에도 관련된 함수들이 있지만, 그건 사용하시면서 각자 알아보시면 좋을것 같습니다.

'Android + Kotlin' 카테고리의 다른 글
[Android + Kotlin] LifecycleEventObserver, DefaultLifecycleObserver 를 사용해보자. (0) | 2022.05.06 |
---|---|
[Android + Kotlin] sortedWith() 로 멀티 조건 정렬을 해보자. (0) | 2022.05.03 |
[Android Kotlin] Webview 디렉토리 충돌 관련 수정 방법 (https://crbug.com/558377) (0) | 2022.03.18 |
[Android Kotlin] sealed class로 Network Response (with Flow)를 구현해보자. (0) | 2022.03.16 |
adb: more than one device/emulator 문제 해결하기 (0) | 2022.03.14 |