티스토리 뷰

코프링으로 개발 시 마주친 생각 관련 포스팅입니다.

개발 환경은 다음과 같습니다.

  • Spring Boot Version : 3.0.1
  • Java Version : 17
  • Kotlin Version : 1.8.21

배경

날짜의 타입은 LocalDateTime이고, 두 날짜의 일수 차이를 구하고 싶었습니다.

첫 번째 시도 : 00:00:00

참고한 블로그 링크입니다.

LocalDateTime은 시간까지 있어서 정확한 일수 차이를 구하려면 00:00:00으로 포메팅하라고 합니다.

좋은 아이디어지만, 저는 간결하지 못하다고 느껴졌습니다.

두 번째 시도 : LocalDate 변환 후 Period 사용

저는 LocalDateTime에서 Time을 뺀 LocalDate로 변환한 다음 Period에서 제공하는 between 함수를 사용하고자 했습니다.

import java.time.LocalDate
import java.time.LocalDateTime
import java.time.Period

fun main() {
    val now = LocalDateTime.now() // 2023-07-20 11:03:00
    val from = LocalDate.of(2023, 7, 24)

    val to = now.toLocalDate()

    val period = Period.between(to, from)

    println(period.days)
}

해당 기능을 함수로 만들어서 사용하고자 했습니다.

세 번째 시도 : 확장 함수

코틀린에서 제공하는 확장 함수를 사용하여 조금 더 간략하게 기능을 구현해봤습니다.

import java.time.LocalDate
import java.time.LocalDateTime
import java.time.Period
import kotlin.math.abs

fun main() {
    val now = LocalDateTime.now() // 2023-07-20 11:03:00
    val from = LocalDate.of(2023, 7, 24)

    println(now.differentDays(from))
}

fun LocalDateTime.differentDays(from: LocalDate): Int {
    return abs(Period.between(this.toLocalDate(), from).days)
}

추가로, abs 함수를 사용하여 절대값으로 만들어줬습니다.

결론

두 날짜의 일수 차이를 구하는 방법에 대해 알아봤습니다.

조금 더 좋은 방법이 있다면 코멘트 부탁드립니다.

문제점 추가

2023-07-28 문제점을 발견하여 수정하였습니다.

Period.between(LocalDate, LocalDate).days는 두 일의 차이를 리턴해줍니다.

다음 예제를 살펴보죠.

import java.time.LocalDate
import java.time.Period
import kotlin.math.abs

fun main() {
    val now = LocalDate.of(2023, 8, 24)
    val from = LocalDate.of(2023, 7, 24)

    println(now.differentDays(from))
}

fun LocalDate.differentDays(from: LocalDate): Int {
    return abs(Period.between(this, from).days)
}

저는 이 코드의 출력값이 31이 나오길 기대했습니다.

하지만, 결과는 0이었습니다.

Period.between().days는 말 그대로 일수의 차이만을 리턴해주는 메서드였습니다.

네 번째 시도 : ChronoUnit 사용

import java.time.LocalDate
import java.time.temporal.ChronoUnit
import kotlin.math.abs

fun main() {
    val now = LocalDate.of(2023, 8, 24)
    val from = LocalDate.of(2023, 7, 24)

    println(now.differentDays(from))
}

internal fun LocalDate.differentDays(from: LocalDate): Long {
    return abs(ChronoUnit.DAYS.between(this, from))
}

위 예제처럼 ChronoUnit으로 변경했더니 원하는 결과값 31을 얻을 수 있었습니다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함