[Android, Kotlin] 안드로이드에서 시간차이 계산 구현

서론

두 지점의 시간 차이를 계산하는 코드는 다양한 곳에 쓰인다. 코드의 수행 시간을 측정할 수 있으며 특정 시간 이후 이벤트를 수행하도록 할 수 있다.

시간 차이 측정은 다양한 방법이 있지만, 이 글에서는 currentTimeMillis()와 elapsedRealtime()를 이용하여 구현한다. currentTimeMillis()는 후술 할 문제점을 안고 있기 때문에 elapsedRealtime() 사용을 권장한다.

currentTimeMillis()는 1970년 1월 1일 자정부터 현재까지의 시간간격을 ms단위로 출력한다. 그래서 시작 지점과 종료지점에 currentTimeMillis() 값을 넣고 종료지점에서 시작 지점을 빼면 두 지점의 시간차이를 출력할 수 있다.

var start = System.currentTimeMillis() // start = 시작시간 - 1970년
var end = System.currentTimeMillis() // end = 종료시간 - 1970년
var current = end-start // current = 종료시간 - 1970년 - (시작시간 - 1970년) = 종료시간 - 시작시간

그러나 currentTimeMillis()는 사용자가 세팅에서 현재시간을 수정했을때 문제가 발생한다. 예를 들어 0시에 시작하고 1분 후에 사용자가 현재시간을 3시로 수정하고 끝내면 실제 시간 차이는 1분이지만 결과는 3시간 1분을 출력하게 된다. 이러한 이유로 시간 간격 측정에는 elapsedRealtime() 사용을 권장한다.

elapsedRealtime()는 디바이스가 부팅된 시점부터 현재까지의 시간간격을 ms단위로 출력한다. 이는 사용자가 현재시간을 수정해도 영향을 받지 않기 때문에 항상 정확한 시간 간격을 출력할 수 있다.

본론

START 버튼으로 시작시간을,  END 버튼으로 종료시간을 지정하고 둘의 시간간격을 텍스트뷰에 출력한다.

currentTimeMillis()

Mainactivity.kt

START버튼(id : button)을 클릭했을 때, 시작시간을 start 변수에 할당한다. currentTimeMillis()의 리턴타입은 Long이다.

var start : Long = 0
button.setOnClickListener{
    start = System.currentTimeMillis()
}

시작시간을 텍스트뷰에서 보기 위해 코드를 추가한다.

var start : Long = 0
button.setOnClickListener{
    start = System.currentTimeMillis()

    // 텍스트뷰에 현재시간 출력
    val date = Date(start)
    val mFormat = SimpleDateFormat("HH:mm:ss")
    val time = mFormat.format(date)
    text.setText(time)
}

END 버튼(id : button2)을 클릭했을 때 종료시간을 end 변수에 할당한다.

또한 종료시간을 텍스트뷰에서 보기 위한 코드도 추가한다.

var end : Long = 0
button2.setOnClickListener{
    end = System.currentTimeMillis()
    
    // 텍스트뷰에 현재시간 출력
    val date = Date(end)
    val mFormat = SimpleDateFormat("HH:mm:ss")
    val time = mFormat.format(date)
    text2.setText(time)
}

시간 간격을 텍스트뷰에 출력하기 위한 코드를 추가한다.

var end : Long = 0
button2.setOnClickListener{
    end = System.currentTimeMillis()

    // 텍스트뷰에 현재시간 출력
    val date = Date(end)
    val mFormat = SimpleDateFormat("HH:mm:ss")
    val time = mFormat.format(date)
    text2.setText(time)

    // 시간간격 출력
    text3.setText("Interval : " + (end - start).toString()+ "ms")
}

MainActivity.kt 전체 코드

package com.hydroponicglass.study // 패키지명 수정 필요

import android.os.Bundle
import android.util.Log
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import java.text.SimpleDateFormat
import java.util.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val button : Button = findViewById(R.id.button)
        val button2 : Button = findViewById(R.id.button2)
        val text : TextView = findViewById(R.id.textView)
        val text2 : TextView = findViewById(R.id.textView2)
        val text3 : TextView = findViewById(R.id.textView3)
        var start : Long = 0
        var end : Long = 0

        button.setOnClickListener{
            start = System.currentTimeMillis()

            // 텍스트뷰에 현재시간 출력
            val date = Date(start)
            val mFormat = SimpleDateFormat("HH:mm:ss")
            val time = mFormat.format(date)
            text.setText(time)
        }
        button2.setOnClickListener{
            end = System.currentTimeMillis()

            // 텍스트뷰에 현재시간 출력
            val date = Date(end)
            val mFormat = SimpleDateFormat("HH:mm:ss")
            val time = mFormat.format(date)
            text2.setText(time)

            // 시간간격 출력
            text3.setText("Interval : " + (end - start).toString()+ "ms")
        }
    }
}

elapsedRealtime()

MainActivity.kt

elapsedReaaltime()를 사용하기 위해 SystemClock 모듈을 추가한다.

import android.os.SystemClock

그리고 currentTimeMillis() 구현 코드에서 System.currentTimeMillis()를 SystemClock.elapsedRealtime()로 바꿔준다.

var start : Long = 0
button.setOnClickListener{
    // start = System.currentTimeMillis()
    start = SystemClock.elapsedRealtime()
}

var end : Long = 0
button2.setOnClickListener{
    // end = System.currentTimeMillis()
    end = SystemClock.elapsedRealtime()
}

MainActivity.kt 전체 코드

package com.hydroponicglass.study // 패키지명 수정 필요

import android.os.Bundle
import android.os.SystemClock
import android.util.Log
import android.widget.Button
import android.widget.TextView
import androidx.appcompat.app.AppCompatActivity
import java.text.SimpleDateFormat
import java.util.*

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val button : Button = findViewById(R.id.button)
        val button2 : Button = findViewById(R.id.button2)
        val text : TextView = findViewById(R.id.textView)
        val text2 : TextView = findViewById(R.id.textView2)
        val text3 : TextView = findViewById(R.id.textView3)
        var start : Long = 0
        var end : Long = 0

        button.setOnClickListener{
            start = SystemClock.elapsedRealtime()

            // 텍스트뷰에 현재시간 출력
            val date = Date(start)
            val mFormat = SimpleDateFormat("HH:mm:ss")
            val time = mFormat.format(date)
            text.setText(time)
        }
        button2.setOnClickListener{
            end = SystemClock.elapsedRealtime()

            // 텍스트뷰에 현재시간 출력
            val date = Date(end)
            val mFormat = SimpleDateFormat("HH:mm:ss")
            val time = mFormat.format(date)
            text2.setText(time)

            // 시간간격 출력
            text3.setText("Interval : " + (end - start).toString()+ "ms")
        }
    }
}

참고

https://www.programiz.com/kotlin-programming/examples/current-date-time

http://sangsoonam.github.io/2017/03/01/do-not-use-curenttimemillis-for-time-interval.html

Leave a Comment