feat(chat): 채팅방 시간 표시를 추가한다

This commit is contained in:
2026-06-10 11:29:52 +09:00
parent 4c351da60c
commit 50f0fb3d15
5 changed files with 243 additions and 0 deletions

View File

@@ -0,0 +1,78 @@
package kr.co.vividnext.sodalive.v2.main.chat.model
import android.content.Context
import kr.co.vividnext.sodalive.R
import java.text.ParsePosition
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.Date
import java.util.Locale
import java.util.TimeZone
fun formatChatRoomLastMessageTime(
context: Context,
isoText: String?,
nowMillis: Long = System.currentTimeMillis(),
timeZone: TimeZone = TimeZone.getDefault(),
locale: Locale = Locale.getDefault()
): String {
val messageMillis = parseIsoTimeMillis(isoText)
?: return context.getString(R.string.screen_chat_time_just_now)
val diffMillis = (nowMillis - messageMillis).coerceAtLeast(0L)
val minute = 60_000L
val hour = 60 * minute
val day = 24 * hour
return when {
diffMillis < minute -> context.getString(R.string.screen_chat_time_just_now)
diffMillis < hour -> context.getString(R.string.screen_chat_time_minutes, (diffMillis / minute).toInt())
diffMillis < day -> context.getString(R.string.screen_chat_time_hours, (diffMillis / hour).toInt())
diffMillis < 8 * day -> context.getString(R.string.screen_chat_time_days, (diffMillis / day).toInt())
else -> formatDateText(messageMillis, nowMillis, timeZone, locale)
}
}
private fun parseIsoTimeMillis(isoText: String?): Long? {
if (isoText.isNullOrBlank()) return null
val value = isoText.trim()
val patterns = listOf(
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX",
"yyyy-MM-dd'T'HH:mm:ssXXX",
"yyyy-MM-dd'T'HH:mm:ss.SSSXX",
"yyyy-MM-dd'T'HH:mm:ssXX",
"yyyy-MM-dd'T'HH:mm:ss.SSSX",
"yyyy-MM-dd'T'HH:mm:ssX"
)
for (pattern in patterns) {
val formatter = SimpleDateFormat(pattern, Locale.US).apply { isLenient = false }
val position = ParsePosition(0)
val parsed: Date? = formatter.parse(value, position)
if (parsed != null && position.index == value.length) return parsed.time
}
return null
}
private fun formatDateText(
messageMillis: Long,
nowMillis: Long,
timeZone: TimeZone,
locale: Locale
): String {
val nowCalendar = Calendar.getInstance(timeZone, locale).apply { timeInMillis = nowMillis }
val messageCalendar = Calendar.getInstance(timeZone, locale).apply { timeInMillis = messageMillis }
val pattern = if (nowCalendar.get(Calendar.YEAR) == messageCalendar.get(Calendar.YEAR)) {
when (locale.language) {
Locale.ENGLISH.language -> "MMM d"
Locale.JAPANESE.language -> "M月d日"
else -> "M월 d일"
}
} else {
"yyyy.MM.dd"
}
return SimpleDateFormat(pattern, locale).apply { this.timeZone = timeZone }.format(Date(messageMillis))
}