Android - currentTimeMillis(), elapsedRealtime(), uptimeMillis()

Android는 다음과 같이 현재 시간, 경과 시간을 가져오는 API를 제공합니다.

  • System.currentTimeMillis()
  • SystemClock.elapsedRealtime()
  • SystemClock.uptimeMillis()

각각의 API를 소개하고 차이점에 대해서 알아보겠습니다.

System.currentTimeMillis()

현재 시각을 UTC(1970년 1월 1일이 0인 시간)의 millisecond로 리턴합니다. 디바이스에 설정된 현재 시각을 기준으로 리턴하기 때문에, 네트워크가 연결되어 시각이 변경되거나 위도(Time zone)가 변경되어 UTC가 변경될 수 있습니다.

그렇기 때문에, 시간의 차이를 계산할 때 적합하지 않습니다. 물론 짧은 간격으로 사용한다면 문제가 될 가능성이 거의 없습니다.

위와 같은 이유로, currentTimeMillis()를 사용할 때는 ACTION_TIME_TICK, ACTION_TIME_CHANGED, ACTION_TIMEZONE_CHANGED 브로드캐스트를 받아서 시간 변경에 대한 예외처리가 필요합니다.

SystemClock.elapsedRealtime()

부팅된 시점부터 현재까지의 시간을 millisecond로 리턴합니다. 즉, 부팅 직후에는 0을 리턴하고 10초가 지났다면 10000이 리턴됩니다.

중요한 것은 디바이스가 Sleep 상태에 있어도 시간은 측정이 됩니다. 만약 부팅된지 10초가 지났고, 이 중에 5초가 Sleep 상태였어도 API는 10초를 리턴합니다.

따라서, 시간 간격(Interval)을 측정할 때는 이 API를 사용하면 좋습니다.

val startTime: Long = SystemClock.elapsedRealtime()

// do something

val endTime: Long = SystemClock.elapsedRealtime()
val interval = endTime - startTime

SystemClock.elapsedRealtimeNanos()

elapsedRealtimeNanos()elapsedRealtime()와 동일하게 동작하지만, nano seconds를 리턴합니다.

SystemClock.uptimeMillis()

elapsedRealtime()와 마찬가지로 부팅된 시점부터 현재까지의 시간을 millisecond로 리턴합니다. 중요한 것은 디바이스가 Sleep 상태에 있을 때는 시간을 측정하지 않습니다. 즉, 부팅한지 10분이 되었고, 5분 동안 Sleep 상태였다면 5분에 대한 시간만 millisecond로 리턴합니다.

따라서, 시간 간격을 측정할 때 디바이스가 Sleep에 실제 시간 차이와 다르게 계산되어 문제될 수 있습니다.

참고

Loading script...

Related Posts

codechachaCopyright ©2019 codechacha