From 7451fccff95f3eb3235fb1084c3c8bbe8ec11e9d Mon Sep 17 00:00:00 2001 From: klaus Date: Wed, 13 Aug 2025 23:57:39 +0900 Subject: [PATCH] =?UTF-8?q?feat(chat-room):=20=EC=8B=9C=EA=B0=84=20?= =?UTF-8?q?=ED=8F=AC=EB=A7=B7=ED=8C=85=20=EC=9C=A0=ED=8B=B8=20formatMessag?= =?UTF-8?q?eTime=20=EB=8F=84=EC=9E=85=20=EB=B0=8F=20=EC=96=B4=EB=8C=91?= =?UTF-8?q?=ED=84=B0=20=EB=A6=AC=ED=8C=A9=ED=86=A0=EB=A7=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit UTC timestamp를 로컬 타임존/로케일 기준 "오전/오후 h:mm" 형식으로 변환하는 공용 유틸(TimeUtils.kt)을 추가하고, ChatMessageAdapter에서 기존 파일 레벨 함수를 제거하여 공용 유틸을 사용하도록 리팩토링했습니다. - TimeUtils.kt 추가: formatMessageTime(timestamp: Long, locale: Locale) - ChatMessageAdapter: private 함수 제거 및 import 정리 --- .../chat/talk/room/ChatMessageAdapter.kt | 12 -------- .../sodalive/chat/talk/room/TimeUtils.kt | 29 +++++++++++++++++++ 2 files changed, 29 insertions(+), 12 deletions(-) create mode 100644 app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/TimeUtils.kt diff --git a/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/ChatMessageAdapter.kt b/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/ChatMessageAdapter.kt index 3c13ba98..16210dde 100644 --- a/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/ChatMessageAdapter.kt +++ b/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/ChatMessageAdapter.kt @@ -21,9 +21,6 @@ import kr.co.vividnext.sodalive.R import kr.co.vividnext.sodalive.databinding.ItemChatAiMessageBinding import kr.co.vividnext.sodalive.databinding.ItemChatTypingIndicatorBinding import kr.co.vividnext.sodalive.databinding.ItemChatUserMessageBinding -import java.text.SimpleDateFormat -import java.util.Date -import java.util.Locale /** * 채팅 리스트 아이템 타입 정의 (UI 렌더링을 위한 래퍼) @@ -404,13 +401,4 @@ class ChatMessageAdapter : RecyclerView.Adapter() { } } -// region file-level util -private fun formatMessageTime(timestamp: Long): String { - return try { - val df = SimpleDateFormat("a h:mm", Locale.getDefault()) - df.format(Date(timestamp)) - } catch (_: Exception) { - "" - } -} // endregion diff --git a/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/TimeUtils.kt b/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/TimeUtils.kt new file mode 100644 index 00000000..5258577e --- /dev/null +++ b/app/src/main/java/kr/co/vividnext/sodalive/chat/talk/room/TimeUtils.kt @@ -0,0 +1,29 @@ +/* + * 시간 포맷팅 유틸리티 + * - UTC epoch millis(Long)을 입력 받아 사용자의 로케일/로컬 타임존 기준으로 + * "오전/오후 h:mm" 형식의 문자열로 변환한다. + * - 예: 1734190980000L -> "오후 11:03" + */ +package kr.co.vividnext.sodalive.chat.talk.room + +import java.text.SimpleDateFormat +import java.util.Date +import java.util.Locale + +/** + * 메시지 시간 포맷팅 유틸리티 + * + * 입력된 [timestamp]는 UTC 기준 epoch millis여야 하며, + * 결과는 사용자의 시스템 로케일과 시스템 시간대에 맞춰 "오전/오후 h:mm" 형식으로 반환됩니다. + * + * 안정성을 위해 예외가 발생하면 빈 문자열("")을 반환합니다. + */ +fun formatMessageTime(timestamp: Long, locale: Locale = Locale.getDefault()): String { + return try { + // Date는 epoch millis의 절대 시점을 표현하며, SimpleDateFormat은 시스템 기본 타임존을 사용해 로컬 시간으로 포맷합니다. + val df = SimpleDateFormat("a h:mm", locale) + df.format(Date(timestamp)) + } catch (_: Exception) { + "" + } +}