diff --git a/common/utils/src/main/kotlin/com/sangdol/common/utils/KoreaDateTimeExtensions.kt b/common/utils/src/main/kotlin/com/sangdol/common/utils/KoreaDateTimeExtensions.kt new file mode 100644 index 00000000..770e8581 --- /dev/null +++ b/common/utils/src/main/kotlin/com/sangdol/common/utils/KoreaDateTimeExtensions.kt @@ -0,0 +1,20 @@ +package com.sangdol.common.utils + +import java.time.* +import java.time.temporal.ChronoUnit + +private val KST_CLOCK = Clock.system(ZoneId.of("Asia/Seoul")) + +object KoreaDate { + fun today(): LocalDate = LocalDate.now(KST_CLOCK) +} + +object KoreaTime { + fun now(): LocalTime = LocalTime.now(KST_CLOCK).truncatedTo(ChronoUnit.MINUTES) +} + +object KoreaDateTime { + fun now(): LocalDateTime = LocalDateTime.now(KST_CLOCK) +} + +fun Instant.toKoreaDateTime(): LocalDateTime = this.atZone(KST_CLOCK.zone).toLocalDateTime() diff --git a/common/utils/src/test/kotlin/com/sangdol/common/utils/KoreaDateTimeExtensions.kt b/common/utils/src/test/kotlin/com/sangdol/common/utils/KoreaDateTimeExtensions.kt new file mode 100644 index 00000000..01ef215e --- /dev/null +++ b/common/utils/src/test/kotlin/com/sangdol/common/utils/KoreaDateTimeExtensions.kt @@ -0,0 +1,39 @@ +package com.sangdol.common.utils + +import io.kotest.assertions.assertSoftly +import io.kotest.core.spec.style.FunSpec +import io.kotest.matchers.shouldBe +import java.time.Instant +import java.time.LocalDateTime +import java.time.LocalTime +import java.time.ZoneId + +class KoreaDateTimeExtensions : FunSpec({ + + test("한국 시간 기준으로 현재 시간을 가져오며, 초 단위는 제외한다.") { + assertSoftly(KoreaTime.now()) { + val utcNow = LocalTime.now(ZoneId.of("UTC")) + + this.hour shouldBe utcNow.hour.plus(9) + this.minute shouldBe utcNow.minute + this.second shouldBe 0 + this.nano shouldBe 0 + } + } + + test("한국 시간 기준으로 현재 날짜 + 시간을 가져온다.") { + assertSoftly(KoreaDateTime.now()) { + val utcNow = LocalDateTime.now(ZoneId.of("UTC")) + + this.withSecond(0).withNano(0) shouldBe utcNow.plusHours(9).withSecond(0).withNano(0) + } + } + + test("UTC 시간을 한국 시간으로 변환한다.") { + val now = Instant.now() + val kstConverted = now.toKoreaDateTime() + val utc = now.atZone(ZoneId.of("UTC")).toLocalDateTime() + + kstConverted.withSecond(0).withNano(0) shouldBe utc.plusHours(9).withSecond(0).withNano(0) + } +})