안녕하세요~ 챠니입니다! :)
오늘은 날짜형식 변경관련에 대해서 알아보도록 하겠습니다.
글을 작성게된 원인은 다음과 같습니다.
DB를 조회하게되면 create 및 update 시간이 한국기준으로 정상적으로 나오고 있는것을 확인 할 수 있습니다.
하지만 API통신의 결과값에서는
다음과 같이 다른형태로 나오고 있는 상황인데요...
심지어 표기법도 다르지만, 표시하고 있는 시간도 서로 다른상황인데.. 이게 어떻게 된 것일까요???
날짜 표기형식에 대해서 찾아본 결과 다음과 같이 설명을 하고 있습니다.
요청 및 응답에서 모든 날짜와 시간은 UTC(협정 세계시)로 지정되며, 특정 시간대에 대한 오프셋이 있거나 없을 수 있습니다.
다음은 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
'🖥 Programming > 📱 Android (Kotlin)' 카테고리의 다른 글
[Android][kotlin] 레이아웃 StausBar(상단), NavigtationBar(하단) 전체 화면 (0) | 2024.06.24 |
---|---|
[Android][kotlin] CustomDialog 만들기 (2) | 2024.06.11 |
[Android] Android Gradle plugin requires Java 17 to run. You are currently using Java 11. 해결방법 (2) | 2024.01.08 |
[Android] 머티리얼 디자인(Material Design) (0) | 2023.12.27 |
[Android] SSL Error Handler 구글 스토어 대응 (2) | 2023.11.23 |
[Android][kotlin][NestJS] FCM, Firebase Background HeadUp Display not working 관련 문제 해결 (0) | 2023.10.05 |
[Android][kotlin] Fragment간 통신 방법 (0) | 2023.09.08 |
[Android] 앱 아이콘 변경 방법 (logo, icon) (2) | 2023.08.24 |