Intro
앱 개발 도중 빌드 시간을 빌드번호로 만들기 위해 System.currentTimeMillis로 받은 현재 시간을
SimpleDateFormat 클래스를 통해 20220503101100과 같은 형식으로 변환해주는 코드를 작성했다.
//BuildConfig.BUILDTIME: 빌드 시 호출된 System.currentTimeMillis() 결과값
binding.buttonTest.text = SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault())
.format(BuildConfig.BUILDTIME)
그런데 이 코드를 테스트폰과 AVD에서 실행시켰을 때, 둘의 현재 시간이 달라 빌드번호가 다르게 나왔다.
SimpleDateFormat이 절대시간이 아닌 상대시간을 반환해주는것 같아서 이것 저것 수정해보다가 도저히 해결이 안돼서 퇴근 전에 StackOverflow에 질문을 올려놨다.
Get absolute time using result of System.currentTimeMillis in android
I defined BuildConfig field to use as app version. buildConfigField "long", "BUILDTIME", System.currentTimeMillis() + "L" And I can get that value properly in my
stackoverflow.com
오늘 출근하고 다시 들어가보니 답변 2개가 달려있었고, 두 방법 모두 문제를 해결할 수 있었다.
SimpleDateFormat의 TimeZone 설정
첫번째 해결방법은 SimpleDateFormat의 TimeZone을 설정해주는 것이다.
빌드를 대한민국에서 하고있기 때문에 한국의 시간대인 GMT+09:00으로 설정해줬다.
val sdf = SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault())
sdf.timeZone = TimeZone.getTimeZone("GMT+09:00")
val time = sdf.format(System.currentTimeMillis())
아래와 같이 한줄로 줄일수도 있다.
binding.buttonTest.text = SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault())
.apply{ TimeZone.getTimeZone("GMT+09:00") }
.format(System.currentTimeMillis())
java.time 패키지의 클래스 사용하기
내가 올린 질문의 댓글과 답변에 SimpleDateFormat을 사용하는것은 끔찍하다는 의견이 달렸다.
만들어진지 너무 오래되어 구식이고 오작동을 일으키는 것으로 악명이 높으며,
기능들은 이미 java.time 패키지의 클래스들로 대체되었기 때문이라고 한다.
SimpleDateFormat을 사용하지 않고도 아래와 같이 해결할 수 있다.
System.currentTimeMillis를 통해 얻은 결과값을 1970-01-01T00:00Z에서 흐른 시간으로 대입해 현재 시간을 알아오는 방식으로 현재 시간이 몇시인지, 어느 나라에 있는지와 관계없이 같은 값을 집어넣으면 항상 같은 절대시간을 반환해준다.
val instant = Instant.ofEpochMilli(BuildConfig.BUILDTIME)
val odt = instant.atOffset(ZoneOffset.ofHours(9))
val f = DateTimeFormatter.ofPattern("uuuuMMddHHmmss")
val time = odt.format(f)
아래와 같이 한줄로 줄일 수 있다.
val text = Instant.ofEpochMilli(System.currentTimeMillis())
.atOffset(ZoneOffset.ofHours(9))
.format(DateTimeFormatter.ofPattern("uuuuMMddHHmmss"))
두 방법 모두 다른 시간대를 가진 기기에서 같은 값을 반환해준다.
난 SimpleDateFormat을 쓰지 않는것이 좋다는 의견에 따라 2번째 방법을 적용해야겠다.
'Tips > Android' 카테고리의 다른 글
[Android] RecyclerView 스크롤 비활성화 (0) | 2022.05.17 |
---|---|
[Android] Vibrator 클래스로 진동 제어하기 (0) | 2022.05.16 |
[Android] Binding 사용 시 모든 요소가 아무 동작도 안할 때 (0) | 2022.02.09 |
[Android] 오디오 모드 변경 및 볼륨 조절 (0) | 2022.02.07 |
[Android] Ringtone 재생 및 목록 가져오기 (0) | 2022.01.24 |