스팀 앱 개발기 #40 - UTC 시간을 로컬 시간으로 바꾸는 코드 만들기

시작하며...

스팀 API에서 주는 데이터 중에는 시간도 있습니다. 그것은 UTC 시간입니다. 앱에서는 그것을 현재 지역 시간으로 바꿔주어야 합니다. 이번 포스트에서는 사전 작업으로서 그것을 코드로 구현하고자 합니다.


UTC 시간을 로컬 시간으로 바꾸는 확장 함수 구현

"yyyy-MM-dd'T'HH:mm:ss" 또는 "yyyy-MM-dd HH:mm:ss" 형식의 UTC 시간을 갖는 문자열을 현재 지역 시간을 나타내는 문자열로 바꾸는 메소드를 String 클래스의 확장 함수로 구현해 보았습니다. 코드는 아래와 같습니다.

// Precondition: The date format of this string is "yyyy-MM-dd'T'HH:mm:ss" or "yyyy-MM-dd HH:mm:ss"
fun String.fromUtcTimeToLocalTime(): String {
    try {
        val sdf = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")
        val date = sdf.parse(this.replace("T", " ").trim())
        val longUtcTime = date.getTime()
        val offset: Int = TimeZone.getDefault().getOffset(longUtcTime)
        val longLocalTime = longUtcTime + offset
        val dateLocalTime = Date().apply {
            setTime(longLocalTime)
        }
        return sdf.format(dateLocalTime)
    }
    catch (e: ParseException) {
        e.printStackTrace()
        return ""
    }
}

테스트 코드 만들기

위에 보여드린 코드가 잘 작동하는지 테스트를 해보았습니다. 테스트 케이스는 3가지를 만들었습니다.

  • 포맷이 "yyyy-MM-dd'T'HH:mm:ss"인 UTC 시간 문자열을 현재 지역 시간으로 변환
  • 포맷이 "yyyy-MM-dd HH:mm:ss"인 UTC 시간 문자열을 현재 지역 시간으로 변환
  • 시간이 아닌 문자열을 현재 지역 시간으로 변환

코드는 다음과 같습니다.

class StringExtTest {

    // Test case 1: Trying to convert UTC time of which the format is "yyyy-MM-dd'T'HH:mm:ss"
    @Test
    fun fromUtcTimeToLocalTime_case1() {
        val sampleUtcTime = "2022-10-04T00:00:00"
        val convertedLocalTime = sampleUtcTime.fromUtcTimeToLocalTime()
        assertEquals("2022-10-04 09:00:00", convertedLocalTime)
    }

    // Test case 2: Trying to convert UTC time of which the format is "yyyy-MM-dd HH:mm:ss"
    @Test
    fun fromUtcTimeToLocalTime_case2() {
        val sampleUtcTime = "2022-10-04 10:00:00"
        val convertedLocalTime = sampleUtcTime.fromUtcTimeToLocalTime()
        assertEquals("2022-10-04 19:00:00", convertedLocalTime)
    }

    // Test case 3: Trying to convert the string that is not a time
    @Test
    fun fromUtcTimeToLocalTime_case3() {
        val sampleUtcTime = "abcdefg"
        val convertedLocalTime = sampleUtcTime.fromUtcTimeToLocalTime()
        assertTrue(convertedLocalTime.isEmpty())
    }

}

테스트 결과, 모두 성공임을 확인했습니다.


GitHub Commit


참고 자료


마치며...

UTC 시간을 지역 시간으로 바꾸는 방법은 예전에도 알아봤었는데, 잘 되지 않았던 적이 있었습니다. 오늘에야 해결이 되었네요. 마친 후 느끼는 뿌듯함은 개발을 계속 할 수 있게 해주는 원동력인 거 같습니다. 지치지 않고 50대에도, 60대에도 개발을 계속 할 수 있기를 바랍니다.


지난 스팀 앱 개발기

Sort:  
 2 years ago 

[광고] STEEM 개발자 커뮤니티에 참여 하시면, 다양한 혜택을 받을 수 있습니다.

Upvoted! Thank you for supporting witness @jswit.

Coin Marketplace

STEEM 0.18
TRX 0.13
JST 0.027
BTC 60915.02
ETH 2636.51
USDT 1.00
SBD 2.64