본문 바로가기
🖥 Programming/📱 Android (Kotlin)

[Andorid][kotlin] 날짜형식 변경관련(SimpleDateFormat, getTimeZone)

by MinChan-Youn 2023. 12. 5.

안녕하세요~ 챠니입니다! :)

오늘은 날짜형식 변경관련에 대해서 알아보도록 하겠습니다.

 

글을 작성게된 원인은 다음과 같습니다.

 

DateBase

DB를 조회하게되면 create 및 update 시간이 한국기준으로 정상적으로 나오고 있는것을 확인 할 수 있습니다.

 

하지만 API통신의 결과값에서는

다음과 같이 다른형태로 나오고 있는 상황인데요...

심지어 표기법도 다르지만, 표시하고 있는 시간도 서로 다른상황인데.. 이게 어떻게 된 것일까요???

 

 

날짜 표기형식에 대해서 찾아본 결과 다음과 같이 설명을 하고 있습니다.

 

요청 및 응답에서 모든 날짜와 시간은 UTC(협정 세계시)로 지정되며, 특정 시간대에 대한 오프셋이 있거나 없을 수 있습니다.

요청 본문에 날짜 및 시간을 지정할 때는 ISO 사양 8601에 대해 Date and Time Formats (NOTE-datetime)에 정의된 형식 중 하나를 사용합니다.

다음은 NOTE-날짜/시간 문서에 나와 있는 지침입니다.
 
유형구문예시
YYYY = 네 자리 연도
MM = 두 자리 월(01 - 12)
DD = 두 자리 일(01 - 31)
T = 날짜 다음에 시간을 소개하는 리터럴 값
hh = 두 자리 시간(00 - 23)
mm = 두 자리 분(00 - 59)
ss = 두 자리 초(00 - 59)
s = 초의 소수를 나타내는 하나 이상의 숫자
TZD = 시간대 지정자(Z, +hh:mm 또는 -hh:mm)
Z = UTC 시간
+hh:mm = UTC보다 빠른 현지 시간대
-hh:mm = UTC보다 느린 현지 시간대

다음과 같이 설명하고 있습니다.

즉. API 서버에서 내려주는 시간의 기준은 UTC(협정 세계시)를 기준으로 내려주고 있기때문에, 실제 Application에서 대한민국의 시간으로 사용하기 위해서는 변경이 필요하다는 뜻!

 

서울 기준 타임존은 "UTC +09"라고 합니다.

즉 UTC(협정 세계시)를 기준으로 9시간이 차이가 난다는 뜻입니다.

 

 

그렇다면 서버로부터 UTC(협정 세계시)의 시간값을 서울(UTC +09)기준으로 변경하는 방법에 대해서 알아보겠습니다.

API 서버로부터 받고 있는 시간은 위에 나와있는 시간과 같습니다.

 

 

 

 

 

해결방법 1

현재 Android 코드에서 서버로 부터 받는 Model은 Date형식이 아닌 String 형태로 시간값을 전달 받고 있습니다.

data class ResponseModel (
    ...
    
    @SerializedName("createdAt")     var createdAt: String = "",
    @SerializedName("updateAt")      var updateAt: String = "",
    
    ...
)

 

 

UTC(협정 세계시) -> UTC +09(서울 기준)변경하는 함수는 다음과 같습니다.

/** 날짜 형식변경 - ["yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"] -> ["yyyy-MM-dd HH:mm"] */
fun dateFormatString(date: String): String{
    try {
        val oldFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")   // 받은 데이터 형식
        //oldFormat.timeZone = TimeZone.getTimeZone("UTC")
        oldFormat.timeZone = TimeZone.getTimeZone("Asia/Seoul")
        val oldDate = oldFormat.parse(date)

        val newFormat = SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.KOREAN) // 바꿀 데이터 형식
        newFormat.timeZone = TimeZone.getTimeZone("Asia/Seoul")                 //ex) "2016-11-01T15:25"

        return newFormat.format(oldDate)
    } catch (e: Exception) {
        TLog.printStackTrace(e)
    }

    return ""
}

 

"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"는 협정 세계시를 나타냅니다. (뒤에 'Z'가 있음)

oldFormat에 대한 TimeZone은 서버의 TimeZone과 맞춰주어야합니다.

서버에서는 "UTC"기준인지, "Asia/Seoul"기준인지에 따라

위의 코드처럼, 서버의 TimeZone을 설정 및 newFormat의 TimeZone도 같이 설정합니다.

 

기존 String형태를 UTC(협정 세계시) Date 형식으로 변환 및 TimeZone을 다시 "Asia/Seoul"에 맞게 변경하는 함수입니다.

 

 

 

 

 

해결방법 2

두번째 방법은 다음과 같습니다.

현재 Android 코드에서 서버로 부터 받는 Model은 Date형식이 형태로 시간값을 전달 받기

 

data class ResponseModel (
    ...
    
    @SerializedName("createdAt")     var createdAt: Date,
    @SerializedName("updateAt")      var updateAt: Date,
    
    ...
)

 

이미 기존의 Date형태로 ResponseModel에서 UTC로 인식 및 TimeZone을 KOREAN으로 변경합니다.

/** 날짜 형식변경 - ["yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"] -> ["yyyy-MM-dd HH:mm"] */
//API Model에서 Date형식으로 데이터를 받아서 처리해야함
fun dateFormatString(date: Date?): String{
    try {
        //UTC -> KOREAN
        val newFormat = SimpleDateFormat("yyyy-MM-dd HH:mm", Locale.KOREAN) // 바꿀 데이터 형식
        return newFormat.format(date)
    } catch (e: Exception) {
        TLog.printStackTrace(e)
    }

    return ""
}

 

 

 

 

다음 2가지의 방법으로 UTC(협정 세계시)의 시간값을 서울(UTC +09)로 변경하는 방법에 대해서 알아보았습니다.

 

 

 

 

 

질문 또는 궁굼한 부분은 댓글을 남겨주세요! 친절하게 답변드리겠습니다!

응원의 댓글은 저에게 큰 힘이 된답니다! :)

즐거운 하루되세요!

 

깃허브 보러 놀러오세요 👇 (맞팔환영)

https://github.com/younminchan

 

younminchan - Overview

안드로이드 2년차 개발자 •⚽️/🎤/🥁/🖥/🏃‍♂️/🚴‍♂️/🤟 TechBlog⬇️ minchanyoun.tistory.com - younminchan

github.com