Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이건 관점이 궁금해서 남기는 코멘트인데요.🤔
만약 다른 개발자가 다른 형태로 파싱을 하고 싶은 경우에는 (나현이는 "YYYY.MM.dd" 형태, 저는 "HH:mm:SS"로) 어떻게 하는게 좋다고 생각하나요?

먼저 저의 의견은 DateFormtter.kt를 만든 핵심 목적이 날짜 포맷 문자열이 여기저기 흩어지는걸 방지 하기 위함이니, 패턴을 인자로 받는 범용 함수를 열어두면 표준화가 깨진다고 생각합니다. 따라서 새로운 포맷이 필요하다면 객체에 상수로 추가해 재사용성을 높이도록 하는게 좋다고 생각합니다.

다른 관점으로는.. 정말 일회성으로만 쓰이는 포맷이 많다면 패턴을 직접 받는 함수를 사용할 수 있다고 생각합니다. 그러나 일관성을 깨뜨린다고 생각이 드네요.

Copy link
Collaborator Author

@nhyeonii nhyeonii Feb 6, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

저도 기본적으로는 포맷 문자열이 여기저기 흩어지는 걸 막는 게 이 유틸의 핵심 목적이라고 생각해서 말씀하신 것처럼 패턴을 인자로 받는 범용 함수는 지양하는 쪽에 동의합니다 !!

그래서 여러 화면 / 여러 로직에서 재사용될 가능성이 있는 포맷이라면
DateFormatters 객체에 명시적인 Formatter 상수로 추가하는 게 맞다고 봅니다.
이 방식이 프로젝트에서 허용된 날짜 표현을 자연스럽게 문서화하는 효과도 있다고 생각해요.

저 역시 정말 일회성인 경우는 DateTimeFormatter.ofPattern()을 직접 쓰되 주석으로 왜 커스텀이 필요한지 간단히 적어두거나 한 파일 내에서만 쓰인다면 private val로 분리하는 것도 방법이겠지만 .. 의도적으로 사용 범위를 제한해서 이건 예외적인 표현이다라는 점이 드러나게 하는 게 중요할 것 같아요. 이미 날짜 포맷을 위한 유틸이 존재하는 상황에서 이를 사용하지 않는다면 오히려 왜 이 포맷만 예외인지를 이해하기 어려워질 수 있다는 생각도 듭니다..!

Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package com.hilingual.core.common.util

import java.time.LocalDate
import java.time.LocalDateTime
import java.time.format.DateTimeFormatter
import java.util.Locale

object DateFormatters {
val KOREAN_FULL_DATE: DateTimeFormatter = DateTimeFormatter.ofPattern("M월 d일 EEEE", Locale.KOREA)

val KOREAN_SHORT_DATE: DateTimeFormatter = DateTimeFormatter.ofPattern("M월 d일", Locale.KOREA)

val ISO_DATE: DateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE
}

/**
* LocalDate를 한국어 전체 날짜 형식으로 변환합니다.
* @return "M월 d일 EEEE" 형식의 문자열 (예: "2월 6일 목요일")
*/
fun LocalDate.toKoreanFullDate(): String = this.format(DateFormatters.KOREAN_FULL_DATE)

fun LocalDateTime.toKoreanFullDate(): String = this.format(DateFormatters.KOREAN_FULL_DATE)

/**
* LocalDate를 한국어 짧은 날짜 형식으로 변환합니다.
* @return "M월 d일" 형식의 문자열 (예: "2월 6일")
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이렇게 변환 예시 써주신 게 되게 좋은 것 같아요!! 세심하다🥹

*/
fun LocalDate.toKoreanShortDate(): String = this.format(DateFormatters.KOREAN_SHORT_DATE)

fun LocalDateTime.toKoreanShortDate(): String = this.format(DateFormatters.KOREAN_SHORT_DATE)

/**
* LocalDate를 ISO 날짜 형식으로 변환합니다.
* @return "yyyy-MM-dd" 형식의 문자열 (예: "2026-02-06")
*/
fun LocalDate.toIsoDate(): String = this.format(DateFormatters.ISO_DATE)

fun LocalDateTime.toIsoDate(): String = this.format(DateFormatters.ISO_DATE)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

사용하지 않는 import 정리해주세요!

Original file line number Diff line number Diff line change
Expand Up @@ -18,17 +18,13 @@ package com.hilingual.core.common.util
import java.time.Instant
import java.time.LocalDateTime
import java.time.ZoneId
import java.time.format.DateTimeFormatter
import java.util.Locale
import java.util.concurrent.TimeUnit

private const val ONE_MINUTE = 1L
private const val ONE_HOUR_IN_MINUTES = 60L
private const val ONE_DAY_IN_MINUTES = 1440L
private const val ONE_WEEK_IN_MINUTES = 10080L

private val DATE_FORMATTER = DateTimeFormatter.ofPattern("M월 d일", Locale.KOREA)

fun formatRelativeTime(minutesAgo: Long): String {
return when {
minutesAgo < ONE_MINUTE -> "방금 전"
Expand All @@ -39,7 +35,7 @@ fun formatRelativeTime(minutesAgo: Long): String {
val pastTime = System.currentTimeMillis() - TimeUnit.MINUTES.toMillis(minutesAgo)
val instant = Instant.ofEpochMilli(pastTime)
val localDateTime = LocalDateTime.ofInstant(instant, ZoneId.systemDefault())
DATE_FORMATTER.format(localDateTime)
localDateTime.toKoreanShortDate()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ package com.hilingual.data.diary.repositoryimpl

import android.net.Uri
import com.hilingual.core.common.util.suspendRunCatching
import com.hilingual.core.common.util.toIsoDate
import com.hilingual.data.diary.datasource.DiaryRemoteDataSource
import com.hilingual.data.diary.model.BookmarkResult
import com.hilingual.data.diary.model.DiaryContentModel
Expand All @@ -29,11 +30,8 @@ import com.hilingual.data.diary.model.toModel
import com.hilingual.data.diary.repository.DiaryRepository
import com.hilingual.data.presigned.repository.FileUploaderRepository
import java.time.LocalDate
import java.time.format.DateTimeFormatter
import javax.inject.Inject

private val DATE_FORMATTER: DateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE

internal class DiaryRepositoryImpl @Inject constructor(
private val diaryRemoteDataSource: DiaryRemoteDataSource,
private val fileUploaderRepository: FileUploaderRepository
Expand Down Expand Up @@ -82,7 +80,7 @@ internal class DiaryRepositoryImpl @Inject constructor(

diaryRemoteDataSource.postDiaryFeedbackCreate(
originalText = originalText,
date = date.format(DATE_FORMATTER),
date = date.toIsoDate(),
fileKey = fileKey
).data!!.toModel()
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ import com.hilingual.core.common.provider.LocalTracker
import com.hilingual.core.common.trigger.LocalDialogTrigger
import com.hilingual.core.common.trigger.LocalMessageController
import com.hilingual.core.common.util.UiState
import com.hilingual.core.common.util.toKoreanFullDate
import com.hilingual.core.designsystem.component.button.HilingualButton
import com.hilingual.core.designsystem.component.textfield.HilingualLongTextField
import com.hilingual.core.designsystem.theme.HilingualTheme
Expand Down Expand Up @@ -99,8 +100,6 @@ import kotlinx.collections.immutable.persistentListOf
import kotlinx.coroutines.delay
import java.io.File
import java.time.LocalDate
import java.time.format.DateTimeFormatter
import java.util.Locale
import com.hilingual.core.designsystem.R as DesignSystemR

@Composable
Expand Down Expand Up @@ -542,7 +541,7 @@ private fun DateText(
val selectedDate = selectedDateProvider()

val formattedDate = remember(selectedDate) {
selectedDate.format(DATE_FORMATTER)
selectedDate.toKoreanFullDate()
}

Text(
Expand All @@ -552,9 +551,6 @@ private fun DateText(
)
}

private val DATE_FORMATTER: DateTimeFormatter =
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

요기도 formatter 없애면서 사용하지 않는 import문이 생겼을 것 같은데 확인 부탁드려요~!

DateTimeFormatter.ofPattern("M월 d일 EEEE", Locale.KOREAN)

private fun createTempImageFile(context: Context): Pair<Uri, File> {
val imageFile = File.createTempFile("camera_", ".jpg", context.cacheDir)
val uri = FileProvider.getUriForFile(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,13 +26,9 @@ import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.tooling.preview.PreviewParameter
import androidx.compose.ui.tooling.preview.PreviewParameterProvider
import androidx.compose.ui.unit.dp
import com.hilingual.core.common.util.toKoreanFullDate
import com.hilingual.core.designsystem.theme.HilingualTheme
import java.time.LocalDate
import java.time.format.DateTimeFormatter
import java.util.Locale

private val DATE_FORMATTER: DateTimeFormatter =
DateTimeFormatter.ofPattern("M월 d일 EEEE", Locale.KOREAN)

@Composable
internal fun DiaryDateInfo(
Expand All @@ -42,7 +38,7 @@ internal fun DiaryDateInfo(
modifier: Modifier = Modifier
) {
val formattedDate = remember(selectedDate) {
selectedDate.format(DATE_FORMATTER)
selectedDate.toKoreanFullDate()
}

val isFuture = remember(selectedDate) {
Expand Down
Loading