티스토리 뷰
코프링으로 개발 시 마주친 생각 관련 포스팅입니다.
개발 환경은 다음과 같습니다.
- 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을 얻을 수 있었습니다.
'개발 노트' 카테고리의 다른 글
intellij에서 git 커밋 순서 바꾸기 (0) | 2023.08.02 |
---|---|
[스프링+코틀린] springfox @ApiModelProperty "is"가 붙은 변수 미노출 버그 (0) | 2023.07.25 |
[스프링+코틀린] spring boot 3 Class 'Foo' should have [public, protected] no-arg constructor (0) | 2023.07.20 |
[스프링+코틀린] spring boot 3 webflux spring docs(swagger) 404 에러 (0) | 2023.07.15 |
쿼리 스트링 만들기 리팩터링 (0) | 2023.02.15 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 디자인 패턴
- MSA
- Kotlin
- AWS
- Spring
- Spring Boot
- node.js
- C++
- BAEKJOON
- kotest
- 객체지향
- 알고리즘
- 테라폼
- kkoon9
- Java
- 클린 코드
- 코테
- JPA
- 이팩티브 자바
- 프로그래머스
- 이펙티브 자바
- 백준
- Algorithm
- 디자인패턴
- programmers
- 정규표현식
- Olympiad
- BOJ
- Effective Java
- 클린 아키텍처
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함