From ce3f41055a73456f49f6774bdcdf7d07bc096b53 Mon Sep 17 00:00:00 2001 From: Kim Nahyeon Date: Wed, 4 Feb 2026 17:13:05 +0900 Subject: [PATCH 1/4] refactor: Centralize duplicated DateTimeFormatter into DateFormatters --- .../core/common/util/DateFormatter.kt | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 core/common/src/main/java/com/hilingual/core/common/util/DateFormatter.kt diff --git a/core/common/src/main/java/com/hilingual/core/common/util/DateFormatter.kt b/core/common/src/main/java/com/hilingual/core/common/util/DateFormatter.kt new file mode 100644 index 000000000..92a9cd870 --- /dev/null +++ b/core/common/src/main/java/com/hilingual/core/common/util/DateFormatter.kt @@ -0,0 +1,19 @@ +package com.hilingual.core.common.util + +import java.time.LocalDate +import java.time.format.DateTimeFormatter +import java.util.Locale + +object DateFormatters { + val KOREAN_FULL_DATE: DateTimeFormatter = DateTimeFormatter.ofPattern("M월 d일 EEEE", Locale.KOREAN) + + val KOREAN_SHORT_DATE: DateTimeFormatter = DateTimeFormatter.ofPattern("M월 d일", Locale.KOREA) + + val ISO_DATE: DateTimeFormatter = DateTimeFormatter.ISO_LOCAL_DATE +} + +fun LocalDate.toKoreanFullDate(): String = this.format(DateFormatters.KOREAN_FULL_DATE) + +fun LocalDate.toKoreanShortDate(): String = this.format(DateFormatters.KOREAN_SHORT_DATE) + +fun LocalDate.toIsoDate(): String = this.format(DateFormatters.ISO_DATE) From 5210f11bc4e935d87312a1246e9f1ed073b14fd7 Mon Sep 17 00:00:00 2001 From: Kim Nahyeon Date: Wed, 4 Feb 2026 17:14:17 +0900 Subject: [PATCH 2/4] refactor: update files to use centralized DateFormatters --- .../com/hilingual/core/common/util/FormatRelativeTime.kt | 4 +--- .../data/diary/repositoryimpl/DiaryRepositoryImpl.kt | 6 ++---- .../hilingual/presentation/diarywrite/DiaryWriteScreen.kt | 6 ++---- .../presentation/home/component/footer/DiaryDateInfo.kt | 8 ++------ 4 files changed, 7 insertions(+), 17 deletions(-) diff --git a/core/common/src/main/java/com/hilingual/core/common/util/FormatRelativeTime.kt b/core/common/src/main/java/com/hilingual/core/common/util/FormatRelativeTime.kt index c74532213..cb8699af9 100644 --- a/core/common/src/main/java/com/hilingual/core/common/util/FormatRelativeTime.kt +++ b/core/common/src/main/java/com/hilingual/core/common/util/FormatRelativeTime.kt @@ -27,8 +27,6 @@ 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 -> "방금 전" @@ -39,7 +37,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) + DateFormatters.KOREAN_SHORT_DATE.format(localDateTime) } } } diff --git a/data/diary/src/main/java/com/hilingual/data/diary/repositoryimpl/DiaryRepositoryImpl.kt b/data/diary/src/main/java/com/hilingual/data/diary/repositoryimpl/DiaryRepositoryImpl.kt index 6a6a2eef0..0fef3b2dd 100644 --- a/data/diary/src/main/java/com/hilingual/data/diary/repositoryimpl/DiaryRepositoryImpl.kt +++ b/data/diary/src/main/java/com/hilingual/data/diary/repositoryimpl/DiaryRepositoryImpl.kt @@ -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 @@ -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 @@ -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() } diff --git a/presentation/diarywrite/src/main/java/com/hilingual/presentation/diarywrite/DiaryWriteScreen.kt b/presentation/diarywrite/src/main/java/com/hilingual/presentation/diarywrite/DiaryWriteScreen.kt index 8a98d2077..0a4ef2a35 100644 --- a/presentation/diarywrite/src/main/java/com/hilingual/presentation/diarywrite/DiaryWriteScreen.kt +++ b/presentation/diarywrite/src/main/java/com/hilingual/presentation/diarywrite/DiaryWriteScreen.kt @@ -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 @@ -542,7 +543,7 @@ private fun DateText( val selectedDate = selectedDateProvider() val formattedDate = remember(selectedDate) { - selectedDate.format(DATE_FORMATTER) + selectedDate.toKoreanFullDate() } Text( @@ -552,9 +553,6 @@ private fun DateText( ) } -private val DATE_FORMATTER: DateTimeFormatter = - DateTimeFormatter.ofPattern("M월 d일 EEEE", Locale.KOREAN) - private fun createTempImageFile(context: Context): Pair { val imageFile = File.createTempFile("camera_", ".jpg", context.cacheDir) val uri = FileProvider.getUriForFile( diff --git a/presentation/home/src/main/java/com/hilingual/presentation/home/component/footer/DiaryDateInfo.kt b/presentation/home/src/main/java/com/hilingual/presentation/home/component/footer/DiaryDateInfo.kt index b85aa0d6e..9d68663bb 100644 --- a/presentation/home/src/main/java/com/hilingual/presentation/home/component/footer/DiaryDateInfo.kt +++ b/presentation/home/src/main/java/com/hilingual/presentation/home/component/footer/DiaryDateInfo.kt @@ -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( @@ -42,7 +38,7 @@ internal fun DiaryDateInfo( modifier: Modifier = Modifier ) { val formattedDate = remember(selectedDate) { - selectedDate.format(DATE_FORMATTER) + selectedDate.toKoreanFullDate() } val isFuture = remember(selectedDate) { From 328499618c5d8a2fd52d14512ab603c3f3a79c61 Mon Sep 17 00:00:00 2001 From: Kim Nahyeon Date: Fri, 6 Feb 2026 23:05:11 +0900 Subject: [PATCH 3/4] =?UTF-8?q?refactor:=20=EC=BD=94=EB=93=9C=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../core/common/util/DateFormatter.kt | 21 ++++++++++++++++++- .../core/common/util/FormatRelativeTime.kt | 2 +- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/core/common/src/main/java/com/hilingual/core/common/util/DateFormatter.kt b/core/common/src/main/java/com/hilingual/core/common/util/DateFormatter.kt index 92a9cd870..e0a4624d5 100644 --- a/core/common/src/main/java/com/hilingual/core/common/util/DateFormatter.kt +++ b/core/common/src/main/java/com/hilingual/core/common/util/DateFormatter.kt @@ -1,19 +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.KOREAN) + 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일") + */ 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) diff --git a/core/common/src/main/java/com/hilingual/core/common/util/FormatRelativeTime.kt b/core/common/src/main/java/com/hilingual/core/common/util/FormatRelativeTime.kt index cb8699af9..9e2035f32 100644 --- a/core/common/src/main/java/com/hilingual/core/common/util/FormatRelativeTime.kt +++ b/core/common/src/main/java/com/hilingual/core/common/util/FormatRelativeTime.kt @@ -37,7 +37,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()) - DateFormatters.KOREAN_SHORT_DATE.format(localDateTime) + localDateTime.toKoreanShortDate() } } } From 5aed6dcc47e253fd818763976b123a2e18b11841 Mon Sep 17 00:00:00 2001 From: Kim Nahyeon Date: Sat, 7 Feb 2026 22:47:54 +0900 Subject: [PATCH 4/4] =?UTF-8?q?del:=20=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80?= =?UTF-8?q?=20=EC=95=8A=EB=8A=94=20import=EB=AC=B8=20=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/hilingual/core/common/util/FormatRelativeTime.kt | 2 -- .../com/hilingual/presentation/diarywrite/DiaryWriteScreen.kt | 2 -- 2 files changed, 4 deletions(-) diff --git a/core/common/src/main/java/com/hilingual/core/common/util/FormatRelativeTime.kt b/core/common/src/main/java/com/hilingual/core/common/util/FormatRelativeTime.kt index 9e2035f32..981cf538f 100644 --- a/core/common/src/main/java/com/hilingual/core/common/util/FormatRelativeTime.kt +++ b/core/common/src/main/java/com/hilingual/core/common/util/FormatRelativeTime.kt @@ -18,8 +18,6 @@ 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 diff --git a/presentation/diarywrite/src/main/java/com/hilingual/presentation/diarywrite/DiaryWriteScreen.kt b/presentation/diarywrite/src/main/java/com/hilingual/presentation/diarywrite/DiaryWriteScreen.kt index 0a4ef2a35..0189e98b1 100644 --- a/presentation/diarywrite/src/main/java/com/hilingual/presentation/diarywrite/DiaryWriteScreen.kt +++ b/presentation/diarywrite/src/main/java/com/hilingual/presentation/diarywrite/DiaryWriteScreen.kt @@ -100,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